Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
1.7 MiB
Plaintext
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": "abdullahmalik17/malikclaw", "files": {"config/config.example.json": {"7b53c27818f2fe5f37c2c6d06131af812268e82f": {"t": 1785674154.2160044, "n": 13494, "h": "5a712f2f65505083", "c": "{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true,\n \"model_name\": \"gpt-5.4\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20,\n \"summarize_message_threshold\": 20,\n \"summarize_token_percent\": 75\n }\n },\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"api_base\": \"https://api.openai.com/v1\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\",\n \"api_base\": \"https://api.anthropic.com/v1\",\n \"thinking_level\": \"high\"\n },\n {\n \"_comment\": \"Anthropic Messages API - use native format for direct Anthropic API access\",\n \"model_name\": \"claude-opus-4-6\",\n \"model\": \"anthropic-messages/claude-opus-4-6\",\n \"api_key\": \"sk-ant-your-key\",\n \"api_base\": \"https://api.anthropic.com\"\n },\n {\n \"model_name\": \"gemini\",\n \"model\": \"antigravity/gemini-2.0-flash\",\n \"auth_method\": \"oauth\"\n },\n {\n \"model_name\": \"deepseek\",\n \"model\": \"deepseek/deepseek-chat\",\n \"api_key\": \"sk-your-deepseek-key\"\n },\n {\n \"model_name\": \"longcat\",\n \"model\": \"longcat/LongCat-Flash-Thinking\",\n \"api_key\": \"your-longcat-api-key\"\n },\n {\n \"model_name\": \"modelscope-qwen\",\n \"model\": \"modelscope/Qwen/Qwen3-235B-A22B-Instruct-2507\",\n \"api_key\": \"your-modelscope-access-token\",\n \"api_base\": \"https://api-inference.modelscope.cn/v1\"\n },\n {\n \"model_name\": \"loadbalanced-gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-key1\",\n \"api_base\": \"https://api1.example.com/v1\"\n },\n {\n \"model_name\": \"loadbalanced-gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-key2\",\n \"api_base\": \"https://api2.example.com/v1\"\n }\n ],\n \"channels\": {\n \"telegram\": {\n \"enabled\": false,\n \"token\": \"YOUR_TELEGRAM_BOT_TOKEN\",\n \"base_url\": \"\",\n \"proxy\": \"\",\n \"allow_from\": [\n \"YOUR_USER_ID\"\n ],\n \"reasoning_channel_id\": \"\"\n },\n \"discord\": {\n \"enabled\": false,\n \"token\": \"YOUR_DISCORD_BOT_TOKEN\",\n \"proxy\": \"\",\n \"allow_from\": [],\n \"group_trigger\": {\n \"mention_only\": false\n },\n \"reasoning_channel_id\": \"\"\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"YOUR_QQ_APP_ID\",\n \"app_secret\": \"YOUR_QQ_APP_SECRET\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"maixcam\": {\n \"enabled\": false,\n \"host\": \"0.0.0.0\",\n \"port\": 18790,\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"whatsapp\": {\n \"enabled\": false,\n \"bridge_url\": \"ws://localhost:3001\",\n \"use_native\": false,\n \"session_store_path\": \"\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\",\n \"random_reaction_emoji\": []\n },\n \"dingtalk\": {\n \"enabled\": false,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"slack\": {\n \"enabled\": false,\n \"bot_token\": \"xoxb-YOUR-BOT-TOKEN\",\n \"app_token\": \"xapp-YOUR-APP-TOKEN\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"matrix\": {\n \"enabled\": false,\n \"homeserver\": \"https://matrix.org\",\n \"user_id\": \"@your-bot:matrix.org\",\n \"access_token\": \"YOUR_MATRIX_ACCESS_TOKEN\",\n \"device_id\": \"\",\n \"join_on_invite\": true,\n \"allow_from\": [],\n \"group_trigger\": {\n \"mention_only\": true\n },\n \"placeholder\": {\n \"enabled\": true,\n \"text\": \"Thinking... 💭\"\n },\n \"reasoning_channel_id\": \"\"\n },\n \"googlechat\": {\n \"enabled\": false,\n \"service_account_file\": \"/path/to/google-chat-service-account.json\",\n \"verification_token\": \"\",\n \"bot_user\": \"users/AAAAAAA\",\n \"webhook_path\": \"/webhook/googlechat\",\n \"allow_from\": [],\n \"group_trigger\": {\n \"mention_only\": true\n },\n \"reasoning_channel_id\": \"\"\n },\n \"line\": {\n \"enabled\": false,\n \"channel_secret\": \"YOUR_LINE_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_LINE_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"onebot\": {\n \"enabled\": false,\n \"ws_url\": \"ws://127.0.0.1:3001\",\n \"access_token\": \"\",\n \"reconnect_interval\": 5,\n \"group_trigger_prefix\": [],\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"wecom\": {\n \"_comment\": \"WeCom Bot - Easier setup, supports group chats\",\n \"enabled\": false,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": [],\n \"reply_timeout\": 5,\n \"reasoning_channel_id\": \"\"\n },\n \"wecom_app\": {\n \"_comment\": \"WeCom App (自建应用) - More features, proactive messaging, private chat only.\",\n \"enabled\": false,\n \"corp_id\": \"YOUR_CORP_ID\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": [],\n \"reply_timeout\": 5,\n \"reasoning_channel_id\": \"\"\n },\n \"wecom_aibot\": {\n \"_comment\": \"WeCom AI Bot (智能机器人) - Official WeCom AI Bot integration, supports proactive messaging and private chats.\",\n \"enabled\": false,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"max_steps\": 10,\n \"welcome_message\": \"Hello! I'm your AI assistant. How can I help you today?\",\n \"reasoning_channel_id\": \"\"\n },\n \"irc\": {\n \"enabled\": false,\n \"server\": \"irc.libera.chat:6697\",\n \"tls\": true,\n \"nick\": \"mybot\",\n \"user\": \"\",\n \"real_name\": \"\",\n \"password\": \"\",\n \"nickserv_password\": \"\",\n \"sasl_user\": \"\",\n \"sasl_password\": \"\",\n \"channels\": [\n \"#mychannel\"\n ],\n \"request_caps\": [\n \"server-time\",\n \"message-tags\"\n ],\n \"allow_from\": [],\n \"group_trigger\": {\n \"mention_only\": true\n },\n \"typing\": {\n \"enabled\": false\n },\n \"reasoning_channel_id\": \"\"\n }\n },\n \"providers\": {\n \"_comment\": \"DEPRECATED: Use model_list instead. This will be removed in a future version\",\n \"anthropic\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"openai\": {\n \"api_key\": \"\",\n \"api_base\": \"\",\n \"web_search\": true\n },\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\",\n \"api_base\": \"\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\",\n \"api_base\": \"\"\n },\n \"zhipu\": {\n \"api_key\": \"YOUR_ZHIPU_API_KEY\",\n \"api_base\": \"\"\n },\n \"gemini\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"vllm\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"nvidia\": {\n \"api_key\": \"nvapi-xxx\",\n \"api_base\": \"\",\n \"proxy\": \"http://127.0.0.1:7890\"\n },\n \"moonshot\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"\"\n },\n \"qwen\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"\"\n },\n \"ollama\": {\n \"api_key\": \"\",\n \"api_base\": \"http://localhost:11434/v1\"\n },\n \"cerebras\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"volcengine\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"mistral\": {\n \"api_key\": \"\",\n \"api_base\": \"https://api.mistral.ai/v1\"\n },\n \"avian\": {\n \"api_key\": \"\",\n \"api_base\": \"https://api.avian.io/v1\"\n },\n \"longcat\": {\n \"api_key\": \"\",\n \"api_base\": \"https://api.longcat.chat/openai\"\n },\n \"modelscope\": {\n \"api_key\": \"\",\n \"api_base\": \"https://api-inference.modelscope.cn/v1\"\n },\n \"github_copilot\": {\n \"api_base\": \"localhost:4321\",\n \"connect_mode\": \"grpc\"\n }\n },\n \"tools\": {\n \"allow_read_paths\": null,\n \"allow_write_paths\": null,\n \"web\": {\n \"enabled\": true,\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"api_keys\": [\n \"YOUR_BRAVE_API_KEY\"\n ],\n \"max_results\": 5\n },\n \"tavily\": {\n \"enabled\": false,\n \"api_key\": \"\",\n \"base_url\": \"\",\n \"max_results\": 0\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n },\n \"perplexity\": {\n \"enabled\": false,\n \"api_key\": \"pplx-xxx\",\n \"api_keys\": [\n \"pplx-xxx\"\n ],\n \"max_results\": 5\n },\n \"searxng\": {\n \"enabled\": false,\n \"base_url\": \"http://localhost:8888\",\n \"max_results\": 5\n },\n \"glm_search\": {\n \"enabled\": false,\n \"api_key\": \"\",\n \"base_url\": \"https://open.bigmodel.cn/api/paas/v4/web_search\",\n \"search_engine\": \"search_std\",\n \"max_results\": 5\n },\n \"fetch_limit_bytes\": 10485760\n },\n \"cron\": {\n \"enabled\": true,\n \"exec_timeout_minutes\": 5\n },\n \"mcp\": {\n \"enabled\": false,\n \"discovery\": {\n \"enabled\": false,\n \"ttl\": 5,\n \"max_search_results\": 5,\n \"use_bm25\": true,\n \"use_regex\": false\n },\n \"servers\": {\n \"context7\": {\n \"enabled\": false,\n \"type\": \"http\",\n \"url\": \"https://mcp.context7.com/mcp\",\n \"headers\": {\n \"CONTEXT7_API_KEY\": \"ctx7sk-xx\"\n }\n },\n \"filesystem\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-filesystem\",\n \"/tmp\"\n ]\n },\n \"github\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-github\"\n ],\n \"env\": {\n \"GITHUB_PERSONAL_ACCESS_TOKEN\": \"YOUR_GITHUB_TOKEN\"\n }\n },\n \"brave-search\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-brave-search\"\n ],\n \"env\": {\n \"BRAVE_API_KEY\": \"YOUR_BRAVE_API_KEY\"\n }\n },\n \"postgres\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-postgres\",\n \"postgresql://user:password@localhost/dbname\"\n ]\n },\n \"slack\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-slack\"\n ],\n \"env\": {\n \"SLACK_BOT_TOKEN\": \"YOUR_SLACK_BOT_TOKEN\",\n \"SLACK_TEAM_ID\": \"YOUR_SLACK_TEAM_ID\"\n }\n },\n \"odoo\": {\n \"enabled\": false,\n \"command\": \"python\",\n \"args\": [\n \"scripts/mcp_servers/odoo_server.py\"\n ],\n \"env\": {\n \"ODOO_URL\": \"http://your-odoo-url:8069\",\n \"ODOO_DB\": \"your-db\",\n \"ODOO_USERNAME\": \"admin\",\n \"ODOO_PASSWORD\": \"your-password\"\n }\n }\n }\n },\n \"exec\": {\n \"enabled\": true,\n \"enable_deny_patterns\": true,\n \"custom_deny_patterns\": null,\n \"custom_allow_patterns\": null\n },\n \"skills\": {\n \"enabled\": true,\n \"registries\": {\n \"clawhub\": {\n \"enabled\": true,\n \"base_url\": \"https://clawhub.ai\",\n \"auth_token\": \"\",\n \"search_path\": \"\",\n \"skills_path\": \"\",\n \"download_path\": \"\",\n \"timeout\": 0,\n \"max_zip_size\": 0,\n \"max_response_size\": 0\n }\n },\n \"github\": {\n \"proxy\": \"http://127.0.0.1:7891\",\n \"token\": \"\"\n },\n \"max_concurrent_searches\": 2,\n \"search_cache\": {\n \"max_size\": 50,\n \"ttl_seconds\": 300\n }\n },\n \"media_cleanup\": {\n \"enabled\": true,\n \"max_age_minutes\": 30,\n \"interval_minutes\": 5\n },\n \"append_file\": {\n \"enabled\": true\n },\n \"edit_file\": {\n \"enabled\": true\n },\n \"find_skills\": {\n \"enabled\": true\n },\n \"i2c\": {\n \"enabled\": false\n },\n \"install_skill\": {\n \"enabled\": true\n },\n \"list_dir\": {\n \"enabled\": true\n },\n \"message\": {\n \"enabled\": true\n },\n \"read_file\": {\n \"enabled\": true\n },\n \"spawn\": {\n \"enabled\": true\n },\n \"spi\": {\n \"enabled\": false\n },\n \"subagent\": {\n \"enabled\": true\n },\n \"web_fetch\": {\n \"enabled\": true\n },\n \"write_file\": {\n \"enabled\": true\n },\n \"gmail\": {\n \"enabled\": false\n },\n \"self_improve\": {\n \"enabled\": true\n },\n \"android_control\": {\n \"enabled\": false\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n },\n \"devices\": {\n \"enabled\": false,\n \"monitor_usb\": true\n },\n \"voice\": {\n \"echo_transcription\": false\n },\n \"gateway\": {\n \"host\": \"127.0.0.1\",\n \"port\": 18790\n }\n}\n"}, "0a3535b70975f84f53461b2d904ee3cf40fbe294": {"t": 1785846838.4671984, "n": 13494, "h": "5a712f2f65505083", "c": "{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true,\n \"model_name\": \"gpt-5.4\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20,\n \"summarize_message_threshold\": 20,\n \"summarize_token_percent\": 75\n }\n },\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"api_base\": \"https://api.openai.com/v1\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\",\n \"api_base\": \"https://api.anthropic.com/v1\",\n \"thinking_level\": \"high\"\n },\n {\n \"_comment\": \"Anthropic Messages API - use native format for direct Anthropic API access\",\n \"model_name\": \"claude-opus-4-6\",\n \"model\": \"anthropic-messages/claude-opus-4-6\",\n \"api_key\": \"sk-ant-your-key\",\n \"api_base\": \"https://api.anthropic.com\"\n },\n {\n \"model_name\": \"gemini\",\n \"model\": \"antigravity/gemini-2.0-flash\",\n \"auth_method\": \"oauth\"\n },\n {\n \"model_name\": \"deepseek\",\n \"model\": \"deepseek/deepseek-chat\",\n \"api_key\": \"sk-your-deepseek-key\"\n },\n {\n \"model_name\": \"longcat\",\n \"model\": \"longcat/LongCat-Flash-Thinking\",\n \"api_key\": \"your-longcat-api-key\"\n },\n {\n \"model_name\": \"modelscope-qwen\",\n \"model\": \"modelscope/Qwen/Qwen3-235B-A22B-Instruct-2507\",\n \"api_key\": \"your-modelscope-access-token\",\n \"api_base\": \"https://api-inference.modelscope.cn/v1\"\n },\n {\n \"model_name\": \"loadbalanced-gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-key1\",\n \"api_base\": \"https://api1.example.com/v1\"\n },\n {\n \"model_name\": \"loadbalanced-gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-key2\",\n \"api_base\": \"https://api2.example.com/v1\"\n }\n ],\n \"channels\": {\n \"telegram\": {\n \"enabled\": false,\n \"token\": \"YOUR_TELEGRAM_BOT_TOKEN\",\n \"base_url\": \"\",\n \"proxy\": \"\",\n \"allow_from\": [\n \"YOUR_USER_ID\"\n ],\n \"reasoning_channel_id\": \"\"\n },\n \"discord\": {\n \"enabled\": false,\n \"token\": \"YOUR_DISCORD_BOT_TOKEN\",\n \"proxy\": \"\",\n \"allow_from\": [],\n \"group_trigger\": {\n \"mention_only\": false\n },\n \"reasoning_channel_id\": \"\"\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"YOUR_QQ_APP_ID\",\n \"app_secret\": \"YOUR_QQ_APP_SECRET\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"maixcam\": {\n \"enabled\": false,\n \"host\": \"0.0.0.0\",\n \"port\": 18790,\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"whatsapp\": {\n \"enabled\": false,\n \"bridge_url\": \"ws://localhost:3001\",\n \"use_native\": false,\n \"session_store_path\": \"\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\",\n \"random_reaction_emoji\": []\n },\n \"dingtalk\": {\n \"enabled\": false,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"slack\": {\n \"enabled\": false,\n \"bot_token\": \"xoxb-YOUR-BOT-TOKEN\",\n \"app_token\": \"xapp-YOUR-APP-TOKEN\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"matrix\": {\n \"enabled\": false,\n \"homeserver\": \"https://matrix.org\",\n \"user_id\": \"@your-bot:matrix.org\",\n \"access_token\": \"YOUR_MATRIX_ACCESS_TOKEN\",\n \"device_id\": \"\",\n \"join_on_invite\": true,\n \"allow_from\": [],\n \"group_trigger\": {\n \"mention_only\": true\n },\n \"placeholder\": {\n \"enabled\": true,\n \"text\": \"Thinking... 💭\"\n },\n \"reasoning_channel_id\": \"\"\n },\n \"googlechat\": {\n \"enabled\": false,\n \"service_account_file\": \"/path/to/google-chat-service-account.json\",\n \"verification_token\": \"\",\n \"bot_user\": \"users/AAAAAAA\",\n \"webhook_path\": \"/webhook/googlechat\",\n \"allow_from\": [],\n \"group_trigger\": {\n \"mention_only\": true\n },\n \"reasoning_channel_id\": \"\"\n },\n \"line\": {\n \"enabled\": false,\n \"channel_secret\": \"YOUR_LINE_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_LINE_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"onebot\": {\n \"enabled\": false,\n \"ws_url\": \"ws://127.0.0.1:3001\",\n \"access_token\": \"\",\n \"reconnect_interval\": 5,\n \"group_trigger_prefix\": [],\n \"allow_from\": [],\n \"reasoning_channel_id\": \"\"\n },\n \"wecom\": {\n \"_comment\": \"WeCom Bot - Easier setup, supports group chats\",\n \"enabled\": false,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": [],\n \"reply_timeout\": 5,\n \"reasoning_channel_id\": \"\"\n },\n \"wecom_app\": {\n \"_comment\": \"WeCom App (自建应用) - More features, proactive messaging, private chat only.\",\n \"enabled\": false,\n \"corp_id\": \"YOUR_CORP_ID\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": [],\n \"reply_timeout\": 5,\n \"reasoning_channel_id\": \"\"\n },\n \"wecom_aibot\": {\n \"_comment\": \"WeCom AI Bot (智能机器人) - Official WeCom AI Bot integration, supports proactive messaging and private chats.\",\n \"enabled\": false,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"max_steps\": 10,\n \"welcome_message\": \"Hello! I'm your AI assistant. How can I help you today?\",\n \"reasoning_channel_id\": \"\"\n },\n \"irc\": {\n \"enabled\": false,\n \"server\": \"irc.libera.chat:6697\",\n \"tls\": true,\n \"nick\": \"mybot\",\n \"user\": \"\",\n \"real_name\": \"\",\n \"password\": \"\",\n \"nickserv_password\": \"\",\n \"sasl_user\": \"\",\n \"sasl_password\": \"\",\n \"channels\": [\n \"#mychannel\"\n ],\n \"request_caps\": [\n \"server-time\",\n \"message-tags\"\n ],\n \"allow_from\": [],\n \"group_trigger\": {\n \"mention_only\": true\n },\n \"typing\": {\n \"enabled\": false\n },\n \"reasoning_channel_id\": \"\"\n }\n },\n \"providers\": {\n \"_comment\": \"DEPRECATED: Use model_list instead. This will be removed in a future version\",\n \"anthropic\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"openai\": {\n \"api_key\": \"\",\n \"api_base\": \"\",\n \"web_search\": true\n },\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\",\n \"api_base\": \"\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\",\n \"api_base\": \"\"\n },\n \"zhipu\": {\n \"api_key\": \"YOUR_ZHIPU_API_KEY\",\n \"api_base\": \"\"\n },\n \"gemini\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"vllm\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"nvidia\": {\n \"api_key\": \"nvapi-xxx\",\n \"api_base\": \"\",\n \"proxy\": \"http://127.0.0.1:7890\"\n },\n \"moonshot\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"\"\n },\n \"qwen\": {\n \"api_key\": \"sk-xxx\",\n \"api_base\": \"\"\n },\n \"ollama\": {\n \"api_key\": \"\",\n \"api_base\": \"http://localhost:11434/v1\"\n },\n \"cerebras\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"volcengine\": {\n \"api_key\": \"\",\n \"api_base\": \"\"\n },\n \"mistral\": {\n \"api_key\": \"\",\n \"api_base\": \"https://api.mistral.ai/v1\"\n },\n \"avian\": {\n \"api_key\": \"\",\n \"api_base\": \"https://api.avian.io/v1\"\n },\n \"longcat\": {\n \"api_key\": \"\",\n \"api_base\": \"https://api.longcat.chat/openai\"\n },\n \"modelscope\": {\n \"api_key\": \"\",\n \"api_base\": \"https://api-inference.modelscope.cn/v1\"\n },\n \"github_copilot\": {\n \"api_base\": \"localhost:4321\",\n \"connect_mode\": \"grpc\"\n }\n },\n \"tools\": {\n \"allow_read_paths\": null,\n \"allow_write_paths\": null,\n \"web\": {\n \"enabled\": true,\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"api_keys\": [\n \"YOUR_BRAVE_API_KEY\"\n ],\n \"max_results\": 5\n },\n \"tavily\": {\n \"enabled\": false,\n \"api_key\": \"\",\n \"base_url\": \"\",\n \"max_results\": 0\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n },\n \"perplexity\": {\n \"enabled\": false,\n \"api_key\": \"pplx-xxx\",\n \"api_keys\": [\n \"pplx-xxx\"\n ],\n \"max_results\": 5\n },\n \"searxng\": {\n \"enabled\": false,\n \"base_url\": \"http://localhost:8888\",\n \"max_results\": 5\n },\n \"glm_search\": {\n \"enabled\": false,\n \"api_key\": \"\",\n \"base_url\": \"https://open.bigmodel.cn/api/paas/v4/web_search\",\n \"search_engine\": \"search_std\",\n \"max_results\": 5\n },\n \"fetch_limit_bytes\": 10485760\n },\n \"cron\": {\n \"enabled\": true,\n \"exec_timeout_minutes\": 5\n },\n \"mcp\": {\n \"enabled\": false,\n \"discovery\": {\n \"enabled\": false,\n \"ttl\": 5,\n \"max_search_results\": 5,\n \"use_bm25\": true,\n \"use_regex\": false\n },\n \"servers\": {\n \"context7\": {\n \"enabled\": false,\n \"type\": \"http\",\n \"url\": \"https://mcp.context7.com/mcp\",\n \"headers\": {\n \"CONTEXT7_API_KEY\": \"ctx7sk-xx\"\n }\n },\n \"filesystem\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-filesystem\",\n \"/tmp\"\n ]\n },\n \"github\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-github\"\n ],\n \"env\": {\n \"GITHUB_PERSONAL_ACCESS_TOKEN\": \"YOUR_GITHUB_TOKEN\"\n }\n },\n \"brave-search\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-brave-search\"\n ],\n \"env\": {\n \"BRAVE_API_KEY\": \"YOUR_BRAVE_API_KEY\"\n }\n },\n \"postgres\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-postgres\",\n \"postgresql://user:password@localhost/dbname\"\n ]\n },\n \"slack\": {\n \"enabled\": false,\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"@modelcontextprotocol/server-slack\"\n ],\n \"env\": {\n \"SLACK_BOT_TOKEN\": \"YOUR_SLACK_BOT_TOKEN\",\n \"SLACK_TEAM_ID\": \"YOUR_SLACK_TEAM_ID\"\n }\n },\n \"odoo\": {\n \"enabled\": false,\n \"command\": \"python\",\n \"args\": [\n \"scripts/mcp_servers/odoo_server.py\"\n ],\n \"env\": {\n \"ODOO_URL\": \"http://your-odoo-url:8069\",\n \"ODOO_DB\": \"your-db\",\n \"ODOO_USERNAME\": \"admin\",\n \"ODOO_PASSWORD\": \"your-password\"\n }\n }\n }\n },\n \"exec\": {\n \"enabled\": true,\n \"enable_deny_patterns\": true,\n \"custom_deny_patterns\": null,\n \"custom_allow_patterns\": null\n },\n \"skills\": {\n \"enabled\": true,\n \"registries\": {\n \"clawhub\": {\n \"enabled\": true,\n \"base_url\": \"https://clawhub.ai\",\n \"auth_token\": \"\",\n \"search_path\": \"\",\n \"skills_path\": \"\",\n \"download_path\": \"\",\n \"timeout\": 0,\n \"max_zip_size\": 0,\n \"max_response_size\": 0\n }\n },\n \"github\": {\n \"proxy\": \"http://127.0.0.1:7891\",\n \"token\": \"\"\n },\n \"max_concurrent_searches\": 2,\n \"search_cache\": {\n \"max_size\": 50,\n \"ttl_seconds\": 300\n }\n },\n \"media_cleanup\": {\n \"enabled\": true,\n \"max_age_minutes\": 30,\n \"interval_minutes\": 5\n },\n \"append_file\": {\n \"enabled\": true\n },\n \"edit_file\": {\n \"enabled\": true\n },\n \"find_skills\": {\n \"enabled\": true\n },\n \"i2c\": {\n \"enabled\": false\n },\n \"install_skill\": {\n \"enabled\": true\n },\n \"list_dir\": {\n \"enabled\": true\n },\n \"message\": {\n \"enabled\": true\n },\n \"read_file\": {\n \"enabled\": true\n },\n \"spawn\": {\n \"enabled\": true\n },\n \"spi\": {\n \"enabled\": false\n },\n \"subagent\": {\n \"enabled\": true\n },\n \"web_fetch\": {\n \"enabled\": true\n },\n \"write_file\": {\n \"enabled\": true\n },\n \"gmail\": {\n \"enabled\": false\n },\n \"self_improve\": {\n \"enabled\": true\n },\n \"android_control\": {\n \"enabled\": false\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n },\n \"devices\": {\n \"enabled\": false,\n \"monitor_usb\": true\n },\n \"voice\": {\n \"echo_transcription\": false\n },\n \"gateway\": {\n \"host\": \"127.0.0.1\",\n \"port\": 18790\n }\n}\n"}}, "README.vi.md": {"7b53c27818f2fe5f37c2c6d06131af812268e82f": {"t": 1785674177.166162, "n": 39363, "h": "15f332cc7b10aa7c", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Ultra-Efficient Personal AI Assistant for Edge Hardware</h3>\n <p><strong>$10 Hardware · &lt;10MB RAM · &lt;1s Boot · آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Multi-Architecture Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/pulls\"><img src=\"https://img.shields.io/github/issues-pr/AbdullahMalik17/malikclaw\" alt=\"GitHub pull requests\"></a>\n <br>\n <img src=\"https://img.shields.io/github/languages/code-size/AbdullahMalik17/malikclaw\" alt=\"GitHub code size\">\n <img src=\"https://img.shields.io/github/contributors/AbdullahMalik17/malikclaw\" alt=\"GitHub contributors\">\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n[اردو](README.ur.md) | [日本語](README.ja.md) | [Português](README.pt-br.md) | **Tiếng Việt** | [Français](README.fr.md) | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 Cập Nhật Quan Trọng (Tháng 3 2026)**\n>\n> Bản dịch này có thể đã lỗi thời. Để biết thông tin mới nhất, vui lòng xem phiên bản tiếng Anh: **[README.md](README.md)**\n>\n> **Mới:** Vòng lặp agent cấp sản xuất với PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE. Xem [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 **MalikClaw** là trợ lý AI cá nhân siêu nhẹ, lấy cảm hứng từ [nanobot](https://github.com/HKUDS/nanobot), được viết lại hoàn toàn bằng **Go** thông qua quá trình \"tự khởi tạo\" (self-bootstrapping) — nơi chính AI Agent đã tự dẫn dắt toàn bộ quá trình chuyển đổi kiến trúc và tối ưu hóa mã nguồn.\n\n⚡️ **Cực kỳ nhẹ:** Chạy trên phần cứng chỉ **$10** với RAM **<10MB**. Tiết kiệm 99% bộ nhớ so với OpenClaw và rẻ hơn 98% so với Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 TUYÊN BỐ BẢO MẬT & KÊNH CHÍNH THỨC**\n>\n> * **KHÔNG CÓ CRYPTO:** MalikClaw **KHÔNG** có bất kỳ token/coin chính thức nào. Mọi thông tin trên `pump.fun` hoặc các sàn giao dịch khác đều là **LỪA ĐẢO**.\n> * **DOMAIN CHÍNH THỨC:** Website chính thức **DUY NHẤT** là **[malikclaw.io](https://malikclaw.vercel.app)**, website công ty là **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Cảnh báo:** Nhiều tên miền `.ai/.org/.com/.net/...` đã bị bên thứ ba đăng ký, không phải của chúng tôi.\n> * **Cảnh báo:** MalikClaw đang trong giai đoạn phát triển sớm và có thể còn các vấn đề bảo mật mạng chưa được giải quyết. Không nên triển khai lên môi trường production trước phiên bản v1.0.\n> * **Lưu ý:** MalikClaw gần đây đã merge nhiều PR, dẫn đến bộ nhớ sử dụng có thể lớn hơn (10–20MB) ở các phiên bản mới nhất. Chúng tôi sẽ ưu tiên tối ưu tài nguyên khi bộ tính năng đã ổn định.\n\n\n## 📢 Tin tức\n\n2026-02-16 🎉 MalikClaw đạt 12K stars chỉ trong một tuần! Cảm ơn tất cả mọi người! MalikClaw đang phát triển nhanh hơn chúng tôi tưởng tượng. Do số lượng PR tăng cao, chúng tôi cấp thiết cần maintainer từ cộng đồng. Các vai trò tình nguyện viên và roadmap đã được công bố [tại đây](docs/ROADMAP.md) — rất mong đón nhận sự tham gia của bạn!\n\n2026-02-13 🎉 MalikClaw đạt 5000 stars trong 4 ngày! Cảm ơn cộng đồng! Chúng tôi đang hoàn thiện **Lộ trình dự án (Roadmap)** và thiết lập **Nhóm phát triển** để đẩy nhanh tốc độ phát triển MalikClaw.\n🚀 **Kêu gọi hành động:** Vui lòng gửi yêu cầu tính năng tại GitHub Discussions. Chúng tôi sẽ xem xét và ưu tiên trong cuộc họp hàng tuần.\n\n2026-02-09 🎉 MalikClaw chính thức ra mắt! Được xây dựng trong 1 ngày để mang AI Agent đến phần cứng $10 với RAM <10MB. 🦐 MalikClaw, Lên Đường!\n\n## ✨ Tính năng nổi bật\n\n🪶 **Siêu nhẹ**: Bộ nhớ sử dụng <10MB — nhỏ hơn 99% so với Clawdbot (chức năng cốt lõi).\n\n💰 **Chi phí tối thiểu**: Đủ hiệu quả để chạy trên phần cứng $10 — rẻ hơn 98% so với Mac mini.\n\n⚡️ **Khởi động siêu nhanh**: Nhanh gấp 400 lần, khởi động trong 1 giây ngay cả trên CPU đơn nhân 0.6GHz.\n\n🌍 **Di động thực sự**: Một file binary duy nhất chạy trên RISC-V, ARM, MIPS và x86. Một click là chạy!\n\n🤖 **AI tự xây dựng**: Triển khai Go-native tự động — 95% mã nguồn cốt lõi được Agent tạo ra, với sự tinh chỉnh của con người.\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 Demo\n\n### 🛠️ Quy trình trợ lý tiêu chuẩn\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Lập trình Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Quản lý Nhật ký & Kế hoạch</p></th>\n<th><p align=\"center\">🔎 Tìm kiếm Web & Học hỏi</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Phát triển • Triển khai • Mở rộng</td>\n<td align=\"center\">Lên lịch • Tự động hóa • Ghi nhớ</td>\n<td align=\"center\">Khám phá • Phân tích • Xu hướng</td>\n</tr>\n</table>\n\n### 🐜 Triển khai sáng tạo trên phần cứng tối thiểu\n\nMalikClaw có thể triển khai trên hầu hết mọi thiết bị Linux!\n\n* $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) phiên bản E (Ethernet) hoặc W (WiFi6), dùng làm Trợ lý Gia đình tối giản.\n* $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), hoặc $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html), dùng cho quản trị Server tự động.\n* $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) hoặc $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera), dùng cho Giám sát thông minh.\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Nhiều hình thức triển khai hơn đang chờ bạn khám phá!\n\n## 📦 Cài đặt\n\n### Cài đặt bằng binary biên dịch sẵn\n\nTải file binary cho nền tảng của bạn từ [trang Release](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Cài đặt từ mã nguồn (có tính năng mới nhất, khuyên dùng cho phát triển)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build (không cần cài đặt)\nmake build\n\n# Build cho nhiều nền tảng\nmake build-all\n\n# Build và cài đặt\nmake install\n```\n\n## 🐳 Docker Compose\n\nBạn cũng có thể chạy MalikClaw bằng Docker Compose mà không cần cài đặt gì trên máy.\n\n```bash\n# 1. Clone repo\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Lần chạy đầu tiên — tự tạo docker/data/config.json rồi dừng lại\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# Container hiển thị \"First-run setup complete.\" rồi tự dừng.\n\n# 3. Thiết lập API Key\nvim docker/data/config.json # API key của provider, bot token, v.v.\n\n# 4. Khởi động\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Người dùng Docker**: Theo mặc định, Gateway lắng nghe trên `127.0.0.1`, không thể truy cập từ máy chủ. Nếu bạn cần truy cập các endpoint kiểm tra sức khỏe hoặc mở cổng, hãy đặt `MALIKCLAW_GATEWAY_HOST=0.0.0.0` trong môi trường của bạn hoặc cập nhật `config.json`.\n\n```bash\n# 5. Xem logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Dừng\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Chế độ Agent (chạy một lần)\n\n```bash\n# Đặt câu hỏi\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"2+2 bằng mấy?\"\n\n# Chế độ tương tác\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Cập nhật\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Bắt đầu nhanh\n\n> [!TIP]\n> Thiết lập API key trong `~/.malikclaw/config.json`. Lấy API key: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Tìm kiếm web là **tùy chọn** — lấy [Tavily API](https://tavily.com) miễn phí (1000 truy vấn/tháng) hoặc [Brave Search API](https://brave.com/search/api) (2000 truy vấn/tháng).\n\n**1. Khởi tạo**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Cấu hình** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_TELEGRAM_BOT_TOKEN\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Mới**: Định dạng cấu hình `model_list` cho phép thêm nhà cung cấp mà không cần thay đổi mã nguồn. Xem [Cấu hình Mô hình](#cấu-hình-mô-hình-model_list) để biết chi tiết.\n> `request_timeout` là tùy chọn và dùng đơn vị giây. Nếu bỏ qua hoặc đặt `<= 0`, MalikClaw sẽ dùng timeout mặc định (120s).\n\n**3. Lấy API Key**\n\n* **Nhà cung cấp LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Tìm kiếm Web** (tùy chọn): [Brave Search](https://brave.com/search/api) — Có gói miễn phí (2000 truy vấn/tháng)\n\n> **Lưu ý**: Xem `config.example.json` để có mẫu cấu hình đầy đủ.\n\n**4. Trò chuyện**\n\n```bash\nmalikclaw agent -m \"Xin chào, bạn là ai?\"\n```\n\nVậy là xong! Bạn đã có một trợ lý AI hoạt động chỉ trong 2 phút.\n\n---\n\n## 💬 Tích hợp ứng dụng Chat\n\nTrò chuyện với MalikClaw qua Telegram, Discord, DingTalk, LINE hoặc WeCom.\n\n| Kênh | Mức độ thiết lập |\n| --- | --- |\n| **Telegram** | Dễ (chỉ cần token) |\n| **Discord** | Dễ (bot token + intents) |\n| **QQ** | Dễ (AppID + AppSecret) |\n| **DingTalk** | Trung bình (app credentials) |\n| **LINE** | Trung bình (credentials + webhook URL) |\n| **WeCom AI Bot** | Trung bình (Token + khóa AES) |\n\n<details>\n<summary><b>Telegram</b> (Khuyên dùng)</summary>\n\n**1. Tạo bot**\n\n* Mở Telegram, tìm `@BotFather`\n* Gửi `/newbot`, làm theo hướng dẫn\n* Sao chép token\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Lấy User ID từ `@userinfobot` trên Telegram.\n\n**3. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Tạo bot**\n\n* Truy cập <https://discord.com/developers/applications>\n* Create an application → Bot → Add Bot\n* Sao chép bot token\n\n**2. Bật Intents**\n\n* Trong phần Bot settings, bật **MESSAGE CONTENT INTENT**\n* (Tùy chọn) Bật **SERVER MEMBERS INTENT** nếu muốn dùng danh sách cho phép theo thông tin thành viên\n\n**3. Lấy User ID**\n\n* Discord Settings → Advanced → bật **Developer Mode**\n* Click chuột phải vào avatar → **Copy User ID**\n\n**4. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Mời bot vào server**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Mở URL mời được tạo và thêm bot vào server của bạn\n\n**6. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Tạo bot**\n\n* Truy cập [QQ Open Platform](https://q.qq.com/#)\n* Tạo ứng dụng → Lấy **AppID** và **AppSecret**\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Để `allow_from` trống để cho phép tất cả người dùng, hoặc chỉ định số QQ để giới hạn quyền truy cập.\n\n**3. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Tạo bot**\n\n* Truy cập [Open Platform](https://open.dingtalk.com/)\n* Tạo ứng dụng nội bộ\n* Sao chép Client ID và Client Secret\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Để `allow_from` trống để cho phép tất cả người dùng, hoặc chỉ định ID để giới hạn quyền truy cập.\n\n**3. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Tạo tài khoản LINE Official**\n\n- Truy cập [LINE Developers Console](https://developers.line.biz/)\n- Tạo provider → Tạo Messaging API channel\n- Sao chép **Channel Secret** và **Channel Access Token**\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Thiết lập Webhook URL**\n\nLINE yêu cầu HTTPS cho webhook. Sử dụng reverse proxy hoặc tunnel:\n\n```bash\n# Ví dụ với ngrok\nngrok http 18790\n```\n\nSau đó cài đặt Webhook URL trong LINE Developers Console thành `https://your-domain/webhook/line` và bật **Use webhook**.\n\n**4. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n> Trong nhóm chat, bot chỉ phản hồi khi được @mention. Các câu trả lời sẽ trích dẫn tin nhắn gốc.\n\n> **Docker Compose**: Nếu bạn cần mở port webhook cục bộ, hãy thêm một rule chuyển tiếp từ port Gateway (mặc định 18790) tới host. Lưu ý: LINE webhook được phục vụ bởi Gateway HTTP chung (mặc định 127.0.0.1:18790).\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nMalikClaw hỗ trợ ba loại tích hợp WeCom:\n\n**Tùy chọn 1: WeCom Bot (Robot)** - Thiết lập dễ dàng hơn, hỗ trợ chat nhóm\n**Tùy chọn 2: WeCom App (Ứng dụng Tùy chỉnh)** - Nhiều tính năng hơn, nhắn tin chủ động, chỉ chat riêng tư\n**Tùy chọn 3: WeCom AI Bot (Bot Thông Minh)** - Bot AI chính thức, phản hồi streaming, hỗ trợ nhóm và riêng tư\n\nXem [Hướng dẫn Cấu hình WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) để biết hướng dẫn chi tiết.\n\n**Thiết lập Nhanh - WeCom Bot:**\n\n**1. Tạo bot**\n\n* Truy cập Bảng điều khiển Quản trị WeCom → Chat Nhóm → Thêm Bot Nhóm\n* Sao chép URL webhook (định dạng: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Lưu ý:** Các endpoint webhook của WeCom Bot được phục vụ bởi máy chủ Gateway HTTP dùng chung (mặc định 127.0.0.1:18790). Nếu bạn cần truy cập từ bên ngoài, hãy cấu hình reverse proxy hoặc mở cổng Gateway tương ứng.\n\n**Thiết lập Nhanh - WeCom App:**\n\n**1. Tạo ứng dụng**\n\n* Truy cập Bảng điều khiển Quản trị WeCom → Quản lý Ứng dụng → Tạo Ứng dụng\n* Sao chép **AgentId** và **Secret**\n* Truy cập trang \"Công ty của tôi\", sao chép **CorpID**\n\n**2. Cấu hình nhận tin nhắn**\n\n* Trong chi tiết ứng dụng, nhấp vào \"Nhận Tin nhắn\" → \"Thiết lập API\"\n* Đặt URL thành `http://your-server:18790/webhook/wecom-app`\n* Tạo **Token** và **EncodingAESKey**\n\n**3. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n> **Lưu ý**: WeCom App callback webhook được phục vụ bởi Gateway HTTP chung (mặc định 127.0.0.1:18790). Sử dụng proxy ngược để cung cấp HTTPS trong môi trường production nếu cần.\n\n**Thiết lập Nhanh - WeCom AI Bot:**\n\n**1. Tạo AI Bot**\n\n* Truy cập Bảng điều khiển Quản trị WeCom → Quản lý Ứng dụng → AI Bot\n* Cấu hình URL callback: `http://your-server:18791/webhook/wecom-aibot`\n* Sao chép **Token** và tạo **EncodingAESKey**\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Xin chào! Tôi có thể giúp gì cho bạn?\"\n }\n }\n}\n```\n\n**3. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n> **Lưu ý**: WeCom AI Bot sử dụng giao thức pull streaming — không lo timeout phản hồi. Tác vụ dài (>5,5 phút) tự động chuyển sang gửi qua `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Tham gia Mạng xã hội Agent\n\nKết nối MalikClaw với Mạng xã hội Agent chỉ bằng cách gửi một tin nhắn qua CLI hoặc bất kỳ ứng dụng Chat nào đã tích hợp.\n\n**Đọc `https://clawdchat.ai/skill.md` và làm theo hướng dẫn để tham gia [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Cấu hình chi tiết\n\nFile cấu hình: `~/.malikclaw/config.json`\n\n### Biến môi trường\n\nBạn có thể ghi đè các đường dẫn mặc định bằng cách sử dụng các biến môi trường. Điều này hữu ích cho việc cài đặt di động, triển khai container hóa hoặc chạy malikclaw như một dịch vụ hệ thống. Các biến này độc lập và kiểm soát các đường dẫn khác nhau.\n\n| Biến | Mô tả | Đường dẫn mặc định |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Ghi đè đường dẫn đến file cấu hình. Điều này trực tiếp yêu cầu malikclaw tải file `config.json` nào, bỏ qua tất cả các vị trí khác. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Ghi đè thư mục gốc cho dữ liệu malikclaw. Điều này thay đổi vị trí mặc định của `workspace` và các thư mục dữ liệu khác. | `~/.malikclaw` |\n\n**Ví dụ:**\n\n```bash\n# Chạy malikclaw bằng một file cấu hình cụ thể\n# Đường dẫn workspace sẽ được đọc từ trong file cấu hình đó\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Chạy malikclaw với tất cả dữ liệu được lưu trữ trong /opt/malikclaw\n# Cấu hình sẽ được tải từ ~/.malikclaw/config.json mặc định\n# Workspace sẽ được tạo tại /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Sử dụng cả hai để có thiết lập tùy chỉnh hoàn toàn\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Cấu trúc Workspace\n\nMalikClaw lưu trữ dữ liệu trong workspace đã cấu hình (mặc định: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Phiên hội thoại và lịch sử\n├── memory/ # Bộ nhớ dài hạn (MEMORY.md)\n├── state/ # Trạng thái lưu trữ (kênh cuối cùng, v.v.)\n├── cron/ # Cơ sở dữ liệu tác vụ định kỳ\n├── skills/ # Kỹ năng tùy chỉnh\n├── AGENTS.md # Hướng dẫn hành vi Agent\n├── HEARTBEAT.md # Prompt tác vụ định kỳ (kiểm tra mỗi 30 phút)\n├── IDENTITY.md # Danh tính Agent\n├── SOUL.md # Tâm hồn/Tính cách Agent\n└── USER.md # Tùy chọn người dùng\n```\n\n### 🔒 Hộp cát bảo mật (Security Sandbox)\n\nMalikClaw chạy trong môi trường sandbox theo mặc định. Agent chỉ có thể truy cập file và thực thi lệnh trong phạm vi workspace.\n\n#### Cấu hình mặc định\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Tùy chọn | Mặc định | Mô tả |\n|----------|---------|-------|\n| `workspace` | `~/.malikclaw/workspace` | Thư mục làm việc của agent |\n| `restrict_to_workspace` | `true` | Giới hạn truy cập file/lệnh trong workspace |\n\n#### Công cụ được bảo vệ\n\nKhi `restrict_to_workspace: true`, các công cụ sau bị giới hạn trong sandbox:\n\n| Công cụ | Chức năng | Giới hạn |\n|---------|----------|---------|\n| `read_file` | Đọc file | Chỉ file trong workspace |\n| `write_file` | Ghi file | Chỉ file trong workspace |\n| `list_dir` | Liệt kê thư mục | Chỉ thư mục trong workspace |\n| `edit_file` | Sửa file | Chỉ file trong workspace |\n| `append_file` | Thêm vào file | Chỉ file trong workspace |\n| `exec` | Thực thi lệnh | Đường dẫn lệnh phải trong workspace |\n\n#### Bảo vệ bổ sung cho Exec\n\nNgay cả khi `restrict_to_workspace: false`, công cụ `exec` vẫn chặn các lệnh nguy hiểm sau:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Xóa hàng loạt\n* `format`, `mkfs`, `diskpart` — Định dạng ổ đĩa\n* `dd if=` — Tạo ảnh đĩa\n* Ghi vào `/dev/sd[a-z]` — Ghi trực tiếp lên đĩa\n* `shutdown`, `reboot`, `poweroff` — Tắt/khởi động lại hệ thống\n* Fork bomb `:(){ :|:& };:`\n\n#### Ví dụ lỗi\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Tắt giới hạn (Rủi ro bảo mật)\n\nNếu bạn cần agent truy cập đường dẫn ngoài workspace:\n\n**Cách 1: File cấu hình**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Cách 2: Biến môi trường**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Cảnh báo**: Tắt giới hạn này cho phép agent truy cập mọi đường dẫn trên hệ thống. Chỉ sử dụng cẩn thận trong môi trường được kiểm soát.\n\n#### Tính nhất quán của ranh giới bảo mật\n\nCài đặt `restrict_to_workspace` áp dụng nhất quán trên mọi đường thực thi:\n\n| Đường thực thi | Ranh giới bảo mật |\n|----------------|-------------------|\n| Agent chính | `restrict_to_workspace` ✅ |\n| Subagent / Spawn | Kế thừa cùng giới hạn ✅ |\n| Tác vụ Heartbeat | Kế thừa cùng giới hạn ✅ |\n\nTất cả đường thực thi chia sẻ cùng giới hạn workspace — không có cách nào vượt qua ranh giới bảo mật thông qua subagent hoặc tác vụ định kỳ.\n\n### Heartbeat (Tác vụ định kỳ)\n\nMalikClaw có thể tự động thực hiện các tác vụ định kỳ. Tạo file `HEARTBEAT.md` trong workspace:\n\n```markdown\n# Tác vụ định kỳ\n\n- Kiểm tra email xem có tin nhắn quan trọng không\n- Xem lại lịch cho các sự kiện sắp tới\n- Kiểm tra dự báo thời tiết\n```\n\nAgent sẽ đọc file này mỗi 30 phút (có thể cấu hình) và thực hiện các tác vụ bằng công cụ có sẵn.\n\n#### Tác vụ bất đồng bộ với Spawn\n\nĐối với các tác vụ chạy lâu (tìm kiếm web, gọi API), sử dụng công cụ `spawn` để tạo **subagent**:\n\n```markdown\n# Tác vụ định kỳ\n\n## Tác vụ nhanh (trả lời trực tiếp)\n- Báo cáo thời gian hiện tại\n\n## Tác vụ lâu (dùng spawn cho async)\n- Tìm kiếm tin tức AI trên web và tóm tắt\n- Kiểm tra email và báo cáo tin nhắn quan trọng\n```\n\n**Hành vi chính:**\n\n| Tính năng | Mô tả |\n|-----------|-------|\n| **spawn** | Tạo subagent bất đồng bộ, không chặn heartbeat |\n| **Context độc lập** | Subagent có context riêng, không có lịch sử phiên |\n| **message tool** | Subagent giao tiếp trực tiếp với người dùng qua công cụ message |\n| **Không chặn** | Sau khi spawn, heartbeat tiếp tục tác vụ tiếp theo |\n\n#### Cách Subagent giao tiếp\n\n```\nHeartbeat kích hoạt\n ↓\nAgent đọc HEARTBEAT.md\n ↓\nTác vụ lâu: spawn subagent\n ↓ ↓\nTiếp tục tác vụ tiếp theo Subagent làm việc độc lập\n ↓ ↓\nTất cả tác vụ hoàn thành Subagent dùng công cụ \"message\"\n ↓ ↓\nPhản hồi HEARTBEAT_OK Người dùng nhận kết quả trực tiếp\n```\n\nSubagent có quyền truy cập các công cụ (message, web_search, v.v.) và có thể giao tiếp với người dùng một cách độc lập mà không cần thông qua agent chính.\n\n**Cấu hình:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Tùy chọn | Mặc định | Mô tả |\n|----------|---------|-------|\n| `enabled` | `true` | Bật/tắt heartbeat |\n| `interval` | `30` | Khoảng thời gian kiểm tra (phút, tối thiểu: 5) |\n\n**Biến môi trường:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` để tắt\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` để thay đổi khoảng thời gian\n\n### Nhà cung cấp (Providers)\n\n> [!NOTE]\n> Groq cung cấp dịch vụ chuyển giọng nói thành văn bản miễn phí qua Whisper. Nếu đã cấu hình Groq, tin nhắn âm thanh từ bất kỳ kênh nào sẽ được tự động chuyển thành văn bản ở cấp độ agent.\n\n| Nhà cung cấp | Mục đích | Lấy API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini trực tiếp) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu trực tiếp) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine trực tiếp) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Đang thử nghiệm) | LLM (khuyên dùng, truy cập mọi model) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Đang thử nghiệm) | LLM (Claude trực tiếp) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Đang thử nghiệm) | LLM (GPT trực tiếp) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Đang thử nghiệm) | LLM (DeepSeek trực tiếp) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `groq` | LLM + **Chuyển giọng nói** (Whisper) | [console.groq.com](https://console.groq.com) |\n| `qwen` | LLM (Qwen trực tiếp) | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | LLM (Cerebras trực tiếp) | [cerebras.ai](https://cerebras.ai) |\n\n<details>\n<summary><b>Cấu hình Zhipu</b></summary>\n\n**1. Lấy API key**\n\n* Lấy [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Cấu hình**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Your API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Chạy**\n\n```bash\nmalikclaw agent -m \"Xin chào\"\n```\n\n</details>\n\n<details>\n<summary><b>Ví dụ cấu hình đầy đủ</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Cấu hình Mô hình (model_list)\n\n> **Tính năng mới!** MalikClaw hiện sử dụng phương pháp cấu hình **đặt mô hình vào trung tâm**. Chỉ cần chỉ định dạng `nhà cung cấp/mô hình` (ví dụ: `zhipu/glm-4.7`) để thêm nhà cung cấp mới—**không cần thay đổi mã!**\n\nThiết kế này cũng cho phép **hỗ trợ đa tác nhân** với lựa chọn nhà cung cấp linh hoạt:\n\n- **Tác nhân khác nhau, nhà cung cấp khác nhau** : Mỗi tác nhân có thể sử dụng nhà cung cấp LLM riêng\n- **Mô hình dự phòng** : Cấu hình mô hình chính và dự phòng để tăng độ tin cậy\n- **Cân bằng tải** : Phân phối yêu cầu trên nhiều endpoint khác nhau\n- **Cấu hình tập trung** : Quản lý tất cả nhà cung cấp ở một nơi\n\n#### 📋 Tất cả Nhà cung cấp được Hỗ trợ\n\n| Nhà cung cấp | Prefix `model` | API Base Mặc định | Giao thức | Khóa API |\n|-------------|----------------|-------------------|-----------|----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Lấy Khóa](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Lấy Khóa](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Lấy Khóa](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Lấy Khóa](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Lấy Khóa](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Lấy Khóa](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Lấy Khóa](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Lấy Khóa](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Lấy Khóa](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (không cần khóa) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Lấy Khóa](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Lấy Khóa](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Lấy Khóa](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Lấy Khóa](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Lấy Key](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Lấy Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Tùy chỉnh | Chỉ OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Cấu hình Cơ bản\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Ví dụ theo Nhà cung cấp\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (với OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Chạy `malikclaw auth login --provider anthropic` để thiết lập thông tin xác thực OAuth.\n\n**Proxy/API tùy chỉnh**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Cân bằng Tải tải\n\nĐịnh cấu hình nhiều endpoint cho cùng một tên mô hình—MalikClaw sẽ tự động phân phối round-robin giữa chúng:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Chuyển đổi từ Cấu hình `providers` Cũ\n\nCấu hình `providers` cũ đã **ngừng sử dụng** nhưng vẫn được hỗ trợ để tương thích ngược.\n\n**Cấu hình Cũ (đã ngừng sử dụng):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Cấu hình Mới (khuyến nghị):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nXem hướng dẫn chuyển đổi chi tiết tại [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Tham chiếu CLI\n\n| Lệnh | Mô tả |\n| --- | --- |\n| `malikclaw onboard` | Khởi tạo cấu hình & workspace |\n| `malikclaw agent -m \"...\"` | Trò chuyện với agent |\n| `malikclaw agent` | Chế độ chat tương tác |\n| `malikclaw gateway` | Khởi động gateway (cho bot chat) |\n| `malikclaw status` | Hiển thị trạng thái |\n| `malikclaw cron list` | Liệt kê tất cả tác vụ định kỳ |\n| `malikclaw cron add ...` | Thêm tác vụ định kỳ |\n\n### Tác vụ định kỳ / Nhắc nhở\n\nMalikClaw hỗ trợ nhắc nhở theo lịch và tác vụ lặp lại thông qua công cụ `cron`:\n\n* **Nhắc nhở một lần**: \"Remind me in 10 minutes\" (Nhắc tôi sau 10 phút) → kích hoạt một lần sau 10 phút\n* **Tác vụ lặp lại**: \"Remind me every 2 hours\" (Nhắc tôi mỗi 2 giờ) → kích hoạt mỗi 2 giờ\n* **Biểu thức Cron**: \"Remind me at 9am daily\" (Nhắc tôi lúc 9 giờ sáng mỗi ngày) → sử dụng biểu thức cron\n\nCác tác vụ được lưu trong `~/.malikclaw/workspace/cron/` và được xử lý tự động.\n\n## 🤝 Đóng góp & Lộ trình\n\nChào đón mọi PR! Mã nguồn được thiết kế nhỏ gọn và dễ đọc. 🤗\n\nLộ trình sắp được công bố...\n\nNhóm phát triển đang được xây dựng. Điều kiện tham gia: Ít nhất 1 PR đã được merge.\n\nNhóm người dùng:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Xử lý sự cố\n\n### Tìm kiếm web hiện \"API 配置问题\"\n\nĐiều này là bình thường nếu bạn chưa cấu hình API key cho tìm kiếm. MalikClaw sẽ cung cấp các liên kết hữu ích để tìm kiếm thủ công.\n\nĐể bật tìm kiếm web:\n\n1. **Tùy chọn 1 (Khuyên dùng)**: Lấy API key miễn phí tại [https://brave.com/search/api](https://brave.com/search/api) (2000 truy vấn miễn phí/tháng) để có kết quả tốt nhất.\n2. **Tùy chọn 2 (Không cần thẻ tín dụng)**: Nếu không có key, hệ thống tự động chuyển sang dùng **DuckDuckGo** (không cần key).\n\nThêm key vào `~/.malikclaw/config.json` nếu dùng Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Gặp lỗi lọc nội dung (Content Filtering)\n\nMột số nhà cung cấp (như Zhipu) có bộ lọc nội dung nghiêm ngặt. Thử diễn đạt lại câu hỏi hoặc sử dụng model khác.\n\n### Telegram bot báo \"Conflict: terminated by other getUpdates\"\n\nĐiều này xảy ra khi có một instance bot khác đang chạy. Đảm bảo chỉ có một tiến trình `malikclaw gateway` chạy tại một thời điểm.\n\n---\n\n## 📝 So sánh API Key\n\n| Dịch vụ | Gói miễn phí | Trường hợp sử dụng |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/tháng | Đa model (Claude, GPT-4, v.v.) |\n| **Volcengine CodingPlan** | ¥9.9/tháng đầu | Tốt nhất cho người dùng Trung Quốc, nhiều mô hình SOTA (Doubao, DeepSeek, v.v.) |\n| **Zhipu** | 200K tokens/tháng | Phù hợp cho người dùng Trung Quốc |\n| **Brave Search** | 2000 truy vấn/tháng | Chức năng tìm kiếm web |\n| **Groq** | Có gói miễn phí | Suy luận siêu nhanh (Llama, Mixtral) |\n| **ModelScope** | 2000 yêu cầu/ngày | Suy luận miễn phí (Qwen, GLM, DeepSeek, v.v.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "0a3535b70975f84f53461b2d904ee3cf40fbe294": {"t": 1785846843.5045295, "n": 39363, "h": "15f332cc7b10aa7c", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Ultra-Efficient Personal AI Assistant for Edge Hardware</h3>\n <p><strong>$10 Hardware · &lt;10MB RAM · &lt;1s Boot · آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Multi-Architecture Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/pulls\"><img src=\"https://img.shields.io/github/issues-pr/AbdullahMalik17/malikclaw\" alt=\"GitHub pull requests\"></a>\n <br>\n <img src=\"https://img.shields.io/github/languages/code-size/AbdullahMalik17/malikclaw\" alt=\"GitHub code size\">\n <img src=\"https://img.shields.io/github/contributors/AbdullahMalik17/malikclaw\" alt=\"GitHub contributors\">\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n[اردو](README.ur.md) | [日本語](README.ja.md) | [Português](README.pt-br.md) | **Tiếng Việt** | [Français](README.fr.md) | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 Cập Nhật Quan Trọng (Tháng 3 2026)**\n>\n> Bản dịch này có thể đã lỗi thời. Để biết thông tin mới nhất, vui lòng xem phiên bản tiếng Anh: **[README.md](README.md)**\n>\n> **Mới:** Vòng lặp agent cấp sản xuất với PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE. Xem [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 **MalikClaw** là trợ lý AI cá nhân siêu nhẹ, lấy cảm hứng từ [nanobot](https://github.com/HKUDS/nanobot), được viết lại hoàn toàn bằng **Go** thông qua quá trình \"tự khởi tạo\" (self-bootstrapping) — nơi chính AI Agent đã tự dẫn dắt toàn bộ quá trình chuyển đổi kiến trúc và tối ưu hóa mã nguồn.\n\n⚡️ **Cực kỳ nhẹ:** Chạy trên phần cứng chỉ **$10** với RAM **<10MB**. Tiết kiệm 99% bộ nhớ so với OpenClaw và rẻ hơn 98% so với Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 TUYÊN BỐ BẢO MẬT & KÊNH CHÍNH THỨC**\n>\n> * **KHÔNG CÓ CRYPTO:** MalikClaw **KHÔNG** có bất kỳ token/coin chính thức nào. Mọi thông tin trên `pump.fun` hoặc các sàn giao dịch khác đều là **LỪA ĐẢO**.\n> * **DOMAIN CHÍNH THỨC:** Website chính thức **DUY NHẤT** là **[malikclaw.io](https://malikclaw.vercel.app)**, website công ty là **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Cảnh báo:** Nhiều tên miền `.ai/.org/.com/.net/...` đã bị bên thứ ba đăng ký, không phải của chúng tôi.\n> * **Cảnh báo:** MalikClaw đang trong giai đoạn phát triển sớm và có thể còn các vấn đề bảo mật mạng chưa được giải quyết. Không nên triển khai lên môi trường production trước phiên bản v1.0.\n> * **Lưu ý:** MalikClaw gần đây đã merge nhiều PR, dẫn đến bộ nhớ sử dụng có thể lớn hơn (10–20MB) ở các phiên bản mới nhất. Chúng tôi sẽ ưu tiên tối ưu tài nguyên khi bộ tính năng đã ổn định.\n\n\n## 📢 Tin tức\n\n2026-02-16 🎉 MalikClaw đạt 12K stars chỉ trong một tuần! Cảm ơn tất cả mọi người! MalikClaw đang phát triển nhanh hơn chúng tôi tưởng tượng. Do số lượng PR tăng cao, chúng tôi cấp thiết cần maintainer từ cộng đồng. Các vai trò tình nguyện viên và roadmap đã được công bố [tại đây](docs/ROADMAP.md) — rất mong đón nhận sự tham gia của bạn!\n\n2026-02-13 🎉 MalikClaw đạt 5000 stars trong 4 ngày! Cảm ơn cộng đồng! Chúng tôi đang hoàn thiện **Lộ trình dự án (Roadmap)** và thiết lập **Nhóm phát triển** để đẩy nhanh tốc độ phát triển MalikClaw.\n🚀 **Kêu gọi hành động:** Vui lòng gửi yêu cầu tính năng tại GitHub Discussions. Chúng tôi sẽ xem xét và ưu tiên trong cuộc họp hàng tuần.\n\n2026-02-09 🎉 MalikClaw chính thức ra mắt! Được xây dựng trong 1 ngày để mang AI Agent đến phần cứng $10 với RAM <10MB. 🦐 MalikClaw, Lên Đường!\n\n## ✨ Tính năng nổi bật\n\n🪶 **Siêu nhẹ**: Bộ nhớ sử dụng <10MB — nhỏ hơn 99% so với Clawdbot (chức năng cốt lõi).\n\n💰 **Chi phí tối thiểu**: Đủ hiệu quả để chạy trên phần cứng $10 — rẻ hơn 98% so với Mac mini.\n\n⚡️ **Khởi động siêu nhanh**: Nhanh gấp 400 lần, khởi động trong 1 giây ngay cả trên CPU đơn nhân 0.6GHz.\n\n🌍 **Di động thực sự**: Một file binary duy nhất chạy trên RISC-V, ARM, MIPS và x86. Một click là chạy!\n\n🤖 **AI tự xây dựng**: Triển khai Go-native tự động — 95% mã nguồn cốt lõi được Agent tạo ra, với sự tinh chỉnh của con người.\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 Demo\n\n### 🛠️ Quy trình trợ lý tiêu chuẩn\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Lập trình Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Quản lý Nhật ký & Kế hoạch</p></th>\n<th><p align=\"center\">🔎 Tìm kiếm Web & Học hỏi</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Phát triển • Triển khai • Mở rộng</td>\n<td align=\"center\">Lên lịch • Tự động hóa • Ghi nhớ</td>\n<td align=\"center\">Khám phá • Phân tích • Xu hướng</td>\n</tr>\n</table>\n\n### 🐜 Triển khai sáng tạo trên phần cứng tối thiểu\n\nMalikClaw có thể triển khai trên hầu hết mọi thiết bị Linux!\n\n* $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) phiên bản E (Ethernet) hoặc W (WiFi6), dùng làm Trợ lý Gia đình tối giản.\n* $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), hoặc $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html), dùng cho quản trị Server tự động.\n* $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) hoặc $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera), dùng cho Giám sát thông minh.\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Nhiều hình thức triển khai hơn đang chờ bạn khám phá!\n\n## 📦 Cài đặt\n\n### Cài đặt bằng binary biên dịch sẵn\n\nTải file binary cho nền tảng của bạn từ [trang Release](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Cài đặt từ mã nguồn (có tính năng mới nhất, khuyên dùng cho phát triển)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build (không cần cài đặt)\nmake build\n\n# Build cho nhiều nền tảng\nmake build-all\n\n# Build và cài đặt\nmake install\n```\n\n## 🐳 Docker Compose\n\nBạn cũng có thể chạy MalikClaw bằng Docker Compose mà không cần cài đặt gì trên máy.\n\n```bash\n# 1. Clone repo\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Lần chạy đầu tiên — tự tạo docker/data/config.json rồi dừng lại\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# Container hiển thị \"First-run setup complete.\" rồi tự dừng.\n\n# 3. Thiết lập API Key\nvim docker/data/config.json # API key của provider, bot token, v.v.\n\n# 4. Khởi động\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Người dùng Docker**: Theo mặc định, Gateway lắng nghe trên `127.0.0.1`, không thể truy cập từ máy chủ. Nếu bạn cần truy cập các endpoint kiểm tra sức khỏe hoặc mở cổng, hãy đặt `MALIKCLAW_GATEWAY_HOST=0.0.0.0` trong môi trường của bạn hoặc cập nhật `config.json`.\n\n```bash\n# 5. Xem logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Dừng\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Chế độ Agent (chạy một lần)\n\n```bash\n# Đặt câu hỏi\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"2+2 bằng mấy?\"\n\n# Chế độ tương tác\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Cập nhật\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Bắt đầu nhanh\n\n> [!TIP]\n> Thiết lập API key trong `~/.malikclaw/config.json`. Lấy API key: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Tìm kiếm web là **tùy chọn** — lấy [Tavily API](https://tavily.com) miễn phí (1000 truy vấn/tháng) hoặc [Brave Search API](https://brave.com/search/api) (2000 truy vấn/tháng).\n\n**1. Khởi tạo**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Cấu hình** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_TELEGRAM_BOT_TOKEN\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Mới**: Định dạng cấu hình `model_list` cho phép thêm nhà cung cấp mà không cần thay đổi mã nguồn. Xem [Cấu hình Mô hình](#cấu-hình-mô-hình-model_list) để biết chi tiết.\n> `request_timeout` là tùy chọn và dùng đơn vị giây. Nếu bỏ qua hoặc đặt `<= 0`, MalikClaw sẽ dùng timeout mặc định (120s).\n\n**3. Lấy API Key**\n\n* **Nhà cung cấp LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Tìm kiếm Web** (tùy chọn): [Brave Search](https://brave.com/search/api) — Có gói miễn phí (2000 truy vấn/tháng)\n\n> **Lưu ý**: Xem `config.example.json` để có mẫu cấu hình đầy đủ.\n\n**4. Trò chuyện**\n\n```bash\nmalikclaw agent -m \"Xin chào, bạn là ai?\"\n```\n\nVậy là xong! Bạn đã có một trợ lý AI hoạt động chỉ trong 2 phút.\n\n---\n\n## 💬 Tích hợp ứng dụng Chat\n\nTrò chuyện với MalikClaw qua Telegram, Discord, DingTalk, LINE hoặc WeCom.\n\n| Kênh | Mức độ thiết lập |\n| --- | --- |\n| **Telegram** | Dễ (chỉ cần token) |\n| **Discord** | Dễ (bot token + intents) |\n| **QQ** | Dễ (AppID + AppSecret) |\n| **DingTalk** | Trung bình (app credentials) |\n| **LINE** | Trung bình (credentials + webhook URL) |\n| **WeCom AI Bot** | Trung bình (Token + khóa AES) |\n\n<details>\n<summary><b>Telegram</b> (Khuyên dùng)</summary>\n\n**1. Tạo bot**\n\n* Mở Telegram, tìm `@BotFather`\n* Gửi `/newbot`, làm theo hướng dẫn\n* Sao chép token\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Lấy User ID từ `@userinfobot` trên Telegram.\n\n**3. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Tạo bot**\n\n* Truy cập <https://discord.com/developers/applications>\n* Create an application → Bot → Add Bot\n* Sao chép bot token\n\n**2. Bật Intents**\n\n* Trong phần Bot settings, bật **MESSAGE CONTENT INTENT**\n* (Tùy chọn) Bật **SERVER MEMBERS INTENT** nếu muốn dùng danh sách cho phép theo thông tin thành viên\n\n**3. Lấy User ID**\n\n* Discord Settings → Advanced → bật **Developer Mode**\n* Click chuột phải vào avatar → **Copy User ID**\n\n**4. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Mời bot vào server**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Mở URL mời được tạo và thêm bot vào server của bạn\n\n**6. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Tạo bot**\n\n* Truy cập [QQ Open Platform](https://q.qq.com/#)\n* Tạo ứng dụng → Lấy **AppID** và **AppSecret**\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Để `allow_from` trống để cho phép tất cả người dùng, hoặc chỉ định số QQ để giới hạn quyền truy cập.\n\n**3. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Tạo bot**\n\n* Truy cập [Open Platform](https://open.dingtalk.com/)\n* Tạo ứng dụng nội bộ\n* Sao chép Client ID và Client Secret\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Để `allow_from` trống để cho phép tất cả người dùng, hoặc chỉ định ID để giới hạn quyền truy cập.\n\n**3. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Tạo tài khoản LINE Official**\n\n- Truy cập [LINE Developers Console](https://developers.line.biz/)\n- Tạo provider → Tạo Messaging API channel\n- Sao chép **Channel Secret** và **Channel Access Token**\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Thiết lập Webhook URL**\n\nLINE yêu cầu HTTPS cho webhook. Sử dụng reverse proxy hoặc tunnel:\n\n```bash\n# Ví dụ với ngrok\nngrok http 18790\n```\n\nSau đó cài đặt Webhook URL trong LINE Developers Console thành `https://your-domain/webhook/line` và bật **Use webhook**.\n\n**4. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n> Trong nhóm chat, bot chỉ phản hồi khi được @mention. Các câu trả lời sẽ trích dẫn tin nhắn gốc.\n\n> **Docker Compose**: Nếu bạn cần mở port webhook cục bộ, hãy thêm một rule chuyển tiếp từ port Gateway (mặc định 18790) tới host. Lưu ý: LINE webhook được phục vụ bởi Gateway HTTP chung (mặc định 127.0.0.1:18790).\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nMalikClaw hỗ trợ ba loại tích hợp WeCom:\n\n**Tùy chọn 1: WeCom Bot (Robot)** - Thiết lập dễ dàng hơn, hỗ trợ chat nhóm\n**Tùy chọn 2: WeCom App (Ứng dụng Tùy chỉnh)** - Nhiều tính năng hơn, nhắn tin chủ động, chỉ chat riêng tư\n**Tùy chọn 3: WeCom AI Bot (Bot Thông Minh)** - Bot AI chính thức, phản hồi streaming, hỗ trợ nhóm và riêng tư\n\nXem [Hướng dẫn Cấu hình WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) để biết hướng dẫn chi tiết.\n\n**Thiết lập Nhanh - WeCom Bot:**\n\n**1. Tạo bot**\n\n* Truy cập Bảng điều khiển Quản trị WeCom → Chat Nhóm → Thêm Bot Nhóm\n* Sao chép URL webhook (định dạng: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Lưu ý:** Các endpoint webhook của WeCom Bot được phục vụ bởi máy chủ Gateway HTTP dùng chung (mặc định 127.0.0.1:18790). Nếu bạn cần truy cập từ bên ngoài, hãy cấu hình reverse proxy hoặc mở cổng Gateway tương ứng.\n\n**Thiết lập Nhanh - WeCom App:**\n\n**1. Tạo ứng dụng**\n\n* Truy cập Bảng điều khiển Quản trị WeCom → Quản lý Ứng dụng → Tạo Ứng dụng\n* Sao chép **AgentId** và **Secret**\n* Truy cập trang \"Công ty của tôi\", sao chép **CorpID**\n\n**2. Cấu hình nhận tin nhắn**\n\n* Trong chi tiết ứng dụng, nhấp vào \"Nhận Tin nhắn\" → \"Thiết lập API\"\n* Đặt URL thành `http://your-server:18790/webhook/wecom-app`\n* Tạo **Token** và **EncodingAESKey**\n\n**3. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n> **Lưu ý**: WeCom App callback webhook được phục vụ bởi Gateway HTTP chung (mặc định 127.0.0.1:18790). Sử dụng proxy ngược để cung cấp HTTPS trong môi trường production nếu cần.\n\n**Thiết lập Nhanh - WeCom AI Bot:**\n\n**1. Tạo AI Bot**\n\n* Truy cập Bảng điều khiển Quản trị WeCom → Quản lý Ứng dụng → AI Bot\n* Cấu hình URL callback: `http://your-server:18791/webhook/wecom-aibot`\n* Sao chép **Token** và tạo **EncodingAESKey**\n\n**2. Cấu hình**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Xin chào! Tôi có thể giúp gì cho bạn?\"\n }\n }\n}\n```\n\n**3. Chạy**\n\n```bash\nmalikclaw gateway\n```\n\n> **Lưu ý**: WeCom AI Bot sử dụng giao thức pull streaming — không lo timeout phản hồi. Tác vụ dài (>5,5 phút) tự động chuyển sang gửi qua `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Tham gia Mạng xã hội Agent\n\nKết nối MalikClaw với Mạng xã hội Agent chỉ bằng cách gửi một tin nhắn qua CLI hoặc bất kỳ ứng dụng Chat nào đã tích hợp.\n\n**Đọc `https://clawdchat.ai/skill.md` và làm theo hướng dẫn để tham gia [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Cấu hình chi tiết\n\nFile cấu hình: `~/.malikclaw/config.json`\n\n### Biến môi trường\n\nBạn có thể ghi đè các đường dẫn mặc định bằng cách sử dụng các biến môi trường. Điều này hữu ích cho việc cài đặt di động, triển khai container hóa hoặc chạy malikclaw như một dịch vụ hệ thống. Các biến này độc lập và kiểm soát các đường dẫn khác nhau.\n\n| Biến | Mô tả | Đường dẫn mặc định |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Ghi đè đường dẫn đến file cấu hình. Điều này trực tiếp yêu cầu malikclaw tải file `config.json` nào, bỏ qua tất cả các vị trí khác. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Ghi đè thư mục gốc cho dữ liệu malikclaw. Điều này thay đổi vị trí mặc định của `workspace` và các thư mục dữ liệu khác. | `~/.malikclaw` |\n\n**Ví dụ:**\n\n```bash\n# Chạy malikclaw bằng một file cấu hình cụ thể\n# Đường dẫn workspace sẽ được đọc từ trong file cấu hình đó\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Chạy malikclaw với tất cả dữ liệu được lưu trữ trong /opt/malikclaw\n# Cấu hình sẽ được tải từ ~/.malikclaw/config.json mặc định\n# Workspace sẽ được tạo tại /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Sử dụng cả hai để có thiết lập tùy chỉnh hoàn toàn\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Cấu trúc Workspace\n\nMalikClaw lưu trữ dữ liệu trong workspace đã cấu hình (mặc định: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Phiên hội thoại và lịch sử\n├── memory/ # Bộ nhớ dài hạn (MEMORY.md)\n├── state/ # Trạng thái lưu trữ (kênh cuối cùng, v.v.)\n├── cron/ # Cơ sở dữ liệu tác vụ định kỳ\n├── skills/ # Kỹ năng tùy chỉnh\n├── AGENTS.md # Hướng dẫn hành vi Agent\n├── HEARTBEAT.md # Prompt tác vụ định kỳ (kiểm tra mỗi 30 phút)\n├── IDENTITY.md # Danh tính Agent\n├── SOUL.md # Tâm hồn/Tính cách Agent\n└── USER.md # Tùy chọn người dùng\n```\n\n### 🔒 Hộp cát bảo mật (Security Sandbox)\n\nMalikClaw chạy trong môi trường sandbox theo mặc định. Agent chỉ có thể truy cập file và thực thi lệnh trong phạm vi workspace.\n\n#### Cấu hình mặc định\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Tùy chọn | Mặc định | Mô tả |\n|----------|---------|-------|\n| `workspace` | `~/.malikclaw/workspace` | Thư mục làm việc của agent |\n| `restrict_to_workspace` | `true` | Giới hạn truy cập file/lệnh trong workspace |\n\n#### Công cụ được bảo vệ\n\nKhi `restrict_to_workspace: true`, các công cụ sau bị giới hạn trong sandbox:\n\n| Công cụ | Chức năng | Giới hạn |\n|---------|----------|---------|\n| `read_file` | Đọc file | Chỉ file trong workspace |\n| `write_file` | Ghi file | Chỉ file trong workspace |\n| `list_dir` | Liệt kê thư mục | Chỉ thư mục trong workspace |\n| `edit_file` | Sửa file | Chỉ file trong workspace |\n| `append_file` | Thêm vào file | Chỉ file trong workspace |\n| `exec` | Thực thi lệnh | Đường dẫn lệnh phải trong workspace |\n\n#### Bảo vệ bổ sung cho Exec\n\nNgay cả khi `restrict_to_workspace: false`, công cụ `exec` vẫn chặn các lệnh nguy hiểm sau:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Xóa hàng loạt\n* `format`, `mkfs`, `diskpart` — Định dạng ổ đĩa\n* `dd if=` — Tạo ảnh đĩa\n* Ghi vào `/dev/sd[a-z]` — Ghi trực tiếp lên đĩa\n* `shutdown`, `reboot`, `poweroff` — Tắt/khởi động lại hệ thống\n* Fork bomb `:(){ :|:& };:`\n\n#### Ví dụ lỗi\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Tắt giới hạn (Rủi ro bảo mật)\n\nNếu bạn cần agent truy cập đường dẫn ngoài workspace:\n\n**Cách 1: File cấu hình**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Cách 2: Biến môi trường**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Cảnh báo**: Tắt giới hạn này cho phép agent truy cập mọi đường dẫn trên hệ thống. Chỉ sử dụng cẩn thận trong môi trường được kiểm soát.\n\n#### Tính nhất quán của ranh giới bảo mật\n\nCài đặt `restrict_to_workspace` áp dụng nhất quán trên mọi đường thực thi:\n\n| Đường thực thi | Ranh giới bảo mật |\n|----------------|-------------------|\n| Agent chính | `restrict_to_workspace` ✅ |\n| Subagent / Spawn | Kế thừa cùng giới hạn ✅ |\n| Tác vụ Heartbeat | Kế thừa cùng giới hạn ✅ |\n\nTất cả đường thực thi chia sẻ cùng giới hạn workspace — không có cách nào vượt qua ranh giới bảo mật thông qua subagent hoặc tác vụ định kỳ.\n\n### Heartbeat (Tác vụ định kỳ)\n\nMalikClaw có thể tự động thực hiện các tác vụ định kỳ. Tạo file `HEARTBEAT.md` trong workspace:\n\n```markdown\n# Tác vụ định kỳ\n\n- Kiểm tra email xem có tin nhắn quan trọng không\n- Xem lại lịch cho các sự kiện sắp tới\n- Kiểm tra dự báo thời tiết\n```\n\nAgent sẽ đọc file này mỗi 30 phút (có thể cấu hình) và thực hiện các tác vụ bằng công cụ có sẵn.\n\n#### Tác vụ bất đồng bộ với Spawn\n\nĐối với các tác vụ chạy lâu (tìm kiếm web, gọi API), sử dụng công cụ `spawn` để tạo **subagent**:\n\n```markdown\n# Tác vụ định kỳ\n\n## Tác vụ nhanh (trả lời trực tiếp)\n- Báo cáo thời gian hiện tại\n\n## Tác vụ lâu (dùng spawn cho async)\n- Tìm kiếm tin tức AI trên web và tóm tắt\n- Kiểm tra email và báo cáo tin nhắn quan trọng\n```\n\n**Hành vi chính:**\n\n| Tính năng | Mô tả |\n|-----------|-------|\n| **spawn** | Tạo subagent bất đồng bộ, không chặn heartbeat |\n| **Context độc lập** | Subagent có context riêng, không có lịch sử phiên |\n| **message tool** | Subagent giao tiếp trực tiếp với người dùng qua công cụ message |\n| **Không chặn** | Sau khi spawn, heartbeat tiếp tục tác vụ tiếp theo |\n\n#### Cách Subagent giao tiếp\n\n```\nHeartbeat kích hoạt\n ↓\nAgent đọc HEARTBEAT.md\n ↓\nTác vụ lâu: spawn subagent\n ↓ ↓\nTiếp tục tác vụ tiếp theo Subagent làm việc độc lập\n ↓ ↓\nTất cả tác vụ hoàn thành Subagent dùng công cụ \"message\"\n ↓ ↓\nPhản hồi HEARTBEAT_OK Người dùng nhận kết quả trực tiếp\n```\n\nSubagent có quyền truy cập các công cụ (message, web_search, v.v.) và có thể giao tiếp với người dùng một cách độc lập mà không cần thông qua agent chính.\n\n**Cấu hình:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Tùy chọn | Mặc định | Mô tả |\n|----------|---------|-------|\n| `enabled` | `true` | Bật/tắt heartbeat |\n| `interval` | `30` | Khoảng thời gian kiểm tra (phút, tối thiểu: 5) |\n\n**Biến môi trường:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` để tắt\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` để thay đổi khoảng thời gian\n\n### Nhà cung cấp (Providers)\n\n> [!NOTE]\n> Groq cung cấp dịch vụ chuyển giọng nói thành văn bản miễn phí qua Whisper. Nếu đã cấu hình Groq, tin nhắn âm thanh từ bất kỳ kênh nào sẽ được tự động chuyển thành văn bản ở cấp độ agent.\n\n| Nhà cung cấp | Mục đích | Lấy API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini trực tiếp) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu trực tiếp) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine trực tiếp) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Đang thử nghiệm) | LLM (khuyên dùng, truy cập mọi model) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Đang thử nghiệm) | LLM (Claude trực tiếp) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Đang thử nghiệm) | LLM (GPT trực tiếp) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Đang thử nghiệm) | LLM (DeepSeek trực tiếp) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `groq` | LLM + **Chuyển giọng nói** (Whisper) | [console.groq.com](https://console.groq.com) |\n| `qwen` | LLM (Qwen trực tiếp) | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | LLM (Cerebras trực tiếp) | [cerebras.ai](https://cerebras.ai) |\n\n<details>\n<summary><b>Cấu hình Zhipu</b></summary>\n\n**1. Lấy API key**\n\n* Lấy [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Cấu hình**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Your API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Chạy**\n\n```bash\nmalikclaw agent -m \"Xin chào\"\n```\n\n</details>\n\n<details>\n<summary><b>Ví dụ cấu hình đầy đủ</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Cấu hình Mô hình (model_list)\n\n> **Tính năng mới!** MalikClaw hiện sử dụng phương pháp cấu hình **đặt mô hình vào trung tâm**. Chỉ cần chỉ định dạng `nhà cung cấp/mô hình` (ví dụ: `zhipu/glm-4.7`) để thêm nhà cung cấp mới—**không cần thay đổi mã!**\n\nThiết kế này cũng cho phép **hỗ trợ đa tác nhân** với lựa chọn nhà cung cấp linh hoạt:\n\n- **Tác nhân khác nhau, nhà cung cấp khác nhau** : Mỗi tác nhân có thể sử dụng nhà cung cấp LLM riêng\n- **Mô hình dự phòng** : Cấu hình mô hình chính và dự phòng để tăng độ tin cậy\n- **Cân bằng tải** : Phân phối yêu cầu trên nhiều endpoint khác nhau\n- **Cấu hình tập trung** : Quản lý tất cả nhà cung cấp ở một nơi\n\n#### 📋 Tất cả Nhà cung cấp được Hỗ trợ\n\n| Nhà cung cấp | Prefix `model` | API Base Mặc định | Giao thức | Khóa API |\n|-------------|----------------|-------------------|-----------|----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Lấy Khóa](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Lấy Khóa](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Lấy Khóa](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Lấy Khóa](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Lấy Khóa](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Lấy Khóa](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Lấy Khóa](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Lấy Khóa](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Lấy Khóa](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (không cần khóa) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Lấy Khóa](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Lấy Khóa](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Lấy Khóa](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Lấy Khóa](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Lấy Key](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Lấy Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Tùy chỉnh | Chỉ OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Cấu hình Cơ bản\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Ví dụ theo Nhà cung cấp\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (với OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Chạy `malikclaw auth login --provider anthropic` để thiết lập thông tin xác thực OAuth.\n\n**Proxy/API tùy chỉnh**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Cân bằng Tải tải\n\nĐịnh cấu hình nhiều endpoint cho cùng một tên mô hình—MalikClaw sẽ tự động phân phối round-robin giữa chúng:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Chuyển đổi từ Cấu hình `providers` Cũ\n\nCấu hình `providers` cũ đã **ngừng sử dụng** nhưng vẫn được hỗ trợ để tương thích ngược.\n\n**Cấu hình Cũ (đã ngừng sử dụng):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Cấu hình Mới (khuyến nghị):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nXem hướng dẫn chuyển đổi chi tiết tại [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Tham chiếu CLI\n\n| Lệnh | Mô tả |\n| --- | --- |\n| `malikclaw onboard` | Khởi tạo cấu hình & workspace |\n| `malikclaw agent -m \"...\"` | Trò chuyện với agent |\n| `malikclaw agent` | Chế độ chat tương tác |\n| `malikclaw gateway` | Khởi động gateway (cho bot chat) |\n| `malikclaw status` | Hiển thị trạng thái |\n| `malikclaw cron list` | Liệt kê tất cả tác vụ định kỳ |\n| `malikclaw cron add ...` | Thêm tác vụ định kỳ |\n\n### Tác vụ định kỳ / Nhắc nhở\n\nMalikClaw hỗ trợ nhắc nhở theo lịch và tác vụ lặp lại thông qua công cụ `cron`:\n\n* **Nhắc nhở một lần**: \"Remind me in 10 minutes\" (Nhắc tôi sau 10 phút) → kích hoạt một lần sau 10 phút\n* **Tác vụ lặp lại**: \"Remind me every 2 hours\" (Nhắc tôi mỗi 2 giờ) → kích hoạt mỗi 2 giờ\n* **Biểu thức Cron**: \"Remind me at 9am daily\" (Nhắc tôi lúc 9 giờ sáng mỗi ngày) → sử dụng biểu thức cron\n\nCác tác vụ được lưu trong `~/.malikclaw/workspace/cron/` và được xử lý tự động.\n\n## 🤝 Đóng góp & Lộ trình\n\nChào đón mọi PR! Mã nguồn được thiết kế nhỏ gọn và dễ đọc. 🤗\n\nLộ trình sắp được công bố...\n\nNhóm phát triển đang được xây dựng. Điều kiện tham gia: Ít nhất 1 PR đã được merge.\n\nNhóm người dùng:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Xử lý sự cố\n\n### Tìm kiếm web hiện \"API 配置问题\"\n\nĐiều này là bình thường nếu bạn chưa cấu hình API key cho tìm kiếm. MalikClaw sẽ cung cấp các liên kết hữu ích để tìm kiếm thủ công.\n\nĐể bật tìm kiếm web:\n\n1. **Tùy chọn 1 (Khuyên dùng)**: Lấy API key miễn phí tại [https://brave.com/search/api](https://brave.com/search/api) (2000 truy vấn miễn phí/tháng) để có kết quả tốt nhất.\n2. **Tùy chọn 2 (Không cần thẻ tín dụng)**: Nếu không có key, hệ thống tự động chuyển sang dùng **DuckDuckGo** (không cần key).\n\nThêm key vào `~/.malikclaw/config.json` nếu dùng Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Gặp lỗi lọc nội dung (Content Filtering)\n\nMột số nhà cung cấp (như Zhipu) có bộ lọc nội dung nghiêm ngặt. Thử diễn đạt lại câu hỏi hoặc sử dụng model khác.\n\n### Telegram bot báo \"Conflict: terminated by other getUpdates\"\n\nĐiều này xảy ra khi có một instance bot khác đang chạy. Đảm bảo chỉ có một tiến trình `malikclaw gateway` chạy tại một thời điểm.\n\n---\n\n## 📝 So sánh API Key\n\n| Dịch vụ | Gói miễn phí | Trường hợp sử dụng |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/tháng | Đa model (Claude, GPT-4, v.v.) |\n| **Volcengine CodingPlan** | ¥9.9/tháng đầu | Tốt nhất cho người dùng Trung Quốc, nhiều mô hình SOTA (Doubao, DeepSeek, v.v.) |\n| **Zhipu** | 200K tokens/tháng | Phù hợp cho người dùng Trung Quốc |\n| **Brave Search** | 2000 truy vấn/tháng | Chức năng tìm kiếm web |\n| **Groq** | Có gói miễn phí | Suy luận siêu nhanh (Llama, Mixtral) |\n| **ModelScope** | 2000 yêu cầu/ngày | Suy luận miễn phí (Qwen, GLM, DeepSeek, v.v.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}}, "README.ja.md": {"7b53c27818f2fe5f37c2c6d06131af812268e82f": {"t": 1785674177.3530407, "n": 31084, "h": "3fa199c515f89680", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Ultra-Efficient Personal AI Assistant for Edge Hardware</h3>\n <p><strong>$10 Hardware · &lt;10MB RAM · &lt;1s Boot · آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Multi-Architecture Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/pulls\"><img src=\"https://img.shields.io/github/issues-pr/AbdullahMalik17/malikclaw\" alt=\"GitHub pull requests\"></a>\n <br>\n <img src=\"https://img.shields.io/github/languages/code-size/AbdullahMalik17/malikclaw\" alt=\"GitHub code size\">\n <img src=\"https://img.shields.io/github/contributors/AbdullahMalik17/malikclaw\" alt=\"GitHub contributors\">\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n[اردو](README.ur.md) | **日本語** | [Português](README.pt-br.md) | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 重要更新情報(2026 年 3 月)**\n>\n> この翻訳は古くなっている可能性があります。最新情報は英語版をご覧ください:**[README.md](README.md)**\n>\n> **新機能:** プロダクショングレードのエージェントループ(PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE)。詳細は [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 MalikClaw は [nanobot](https://github.com/HKUDS/nanobot) にインスパイアされた超軽量パーソナル AI アシスタントです。Go でゼロからリファクタリングされ、AI エージェント自身がアーキテクチャの移行とコード最適化を推進するセルフブートストラッピングプロセスで構築されました。\n\n⚡️ $10 のハードウェアで 10MB 未満の RAM で動作:OpenClaw より 99% 少ないメモリ、Mac mini より 98% 安い!\n\n<table align=\"center\">\n <tr align=\"center\">\n <td align=\"center\" valign=\"top\">\n <p align=\"center\">\n <img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n </p>\n </td>\n <td align=\"center\" valign=\"top\">\n <p align=\"center\">\n <img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n </p>\n </td>\n </tr>\n</table>\n\n## 📢 ニュース\n2026-02-09 🎉 MalikClaw リリース!$10 ハードウェアで 10MB 未満の RAM で動く AI エージェントを 1 日で構築。🦐 行くぜ、シャコ!\n\n## ✨ 特徴\n\n🪶 **超軽量**: メモリフットプリント 10MB 未満 — Clawdbot のコア機能より 99% 小さい。\n\n💰 **最小コスト**: $10 ハードウェアで動作 — Mac mini より 98% 安い。\n\n⚡️ **超高速**: 起動時間 400 倍高速、0.6GHz シングルコアでも 1 秒で起動。\n\n🌍 **真のポータビリティ**: RISC-V、ARM、MIPS、x86 対応の単一バイナリ。ワンクリックで Go!\n\n🤖 **AI ブートストラップ**: 自律的な Go ネイティブ実装 — コアの 95% が AI 生成、人間によるレビュー付き。\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 デモンストレーション\n### 🛠️ スタンダードアシスタントワークフロー\n<table align=\"center\">\n <tr align=\"center\">\n <th><p align=\"center\">🧩 フルスタックエンジニア</p></th>\n <th><p align=\"center\">🗂️ ログ&計画管理</p></th>\n <th><p align=\"center\">🔎 Web 検索&学習</p></th>\n </tr>\n <tr>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n </tr>\n <tr>\n <td align=\"center\">開発 · デプロイ · スケール</td>\n <td align=\"center\">スケジュール · 自動化 · メモリ</td>\n <td align=\"center\">発見 · インサイト · トレンド</td>\n </tr>\n</table>\n\n### 🐜 革新的な省フットプリントデプロイ\nMalikClaw はほぼすべての Linux デバイスにデプロイできます!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) または W(WiFi6) バージョン、最小ホームアシスタントに\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html) または $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) サーバー自動メンテナンスに\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) または $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) スマート監視に\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 もっと多くのデプロイ事例が待っています!\n\n## 📦 インストール\n\n### コンパイル済みバイナリでインストール\n\n[リリースページ](https://github.com/AbdullahMalik17/malikclaw/releases) からお使いのプラットフォーム用のファームウェアをダウンロードしてください。\n\n### ソースからインストール(最新機能、開発向け推奨)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# ビルド(インストール不要)\nmake build\n\n# 複数プラットフォーム向けビルド\nmake build-all\n\n# ビルドとインストール\nmake install\n```\n\n## 🐳 Docker Compose\n\nDocker Compose を使えば、ローカルにインストールせずに MalikClaw を実行できます。\n\n```bash\n# 1. リポジトリをクローン\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. 初回起動 — docker/data/config.json を自動生成して終了\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# コンテナが \"First-run setup complete.\" を表示して停止します。\n\n# 3. API キーを設定\nvim docker/data/config.json # プロバイダー API キー、Bot トークンなどを設定\n\n# 4. 起動\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Docker ユーザー**: デフォルトでは、Gateway は `127.0.0.1` でリッスンしており、ホストからアクセスできません。ヘルスチェックエンドポイントにアクセスしたり、ポートを公開したりする必要がある場合は、環境変数で `MALIKCLAW_GATEWAY_HOST=0.0.0.0` を設定するか、`config.json` を更新してください。\n\n```bash\n# 5. ログ確認\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. 停止\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Agent モード(ワンショット)\n\n```bash\n# 質問を投げる\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"What is 2+2?\"\n\n# インタラクティブモード\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### アップデート\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 クイックスタート(ネイティブ)\n\n> [!TIP]\n> `~/.malikclaw/config.json` に API キーを設定してください。API キーの取得先: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)。Web 検索は **任意** です — 無料の [Tavily API](https://tavily.com) (月 1000 クエリ無料) または [Brave Search API](https://brave.com/search/api) (月 2000 クエリ無料)。\n\n**1. 初期化**\n\n```bash\nmalikclaw onboard\n```\n\n**2. 設定** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_TELEGRAM_BOT_TOKEN\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"search\": {\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"tavily\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_TAVILY_API_KEY\",\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n> **新機能**: `model_list` 形式により、プロバイダーをコード変更なしで追加できます。詳細は [モデル設定](#モデル設定-model_list) を参照してください。\n> `request_timeout` は任意の秒単位設定です。省略または `<= 0` の場合、MalikClaw はデフォルトのタイムアウト(120秒)を使用します。\n\n**3. API キーの取得**\n\n- **LLM プロバイダー**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n- **Web 検索**(任意): [Tavily](https://tavily.com) - AI エージェント向けに最適化 (月 1000 リクエスト) · [Brave Search](https://brave.com/search/api) - 無料枠あり(月 2000 リクエスト)\n\n> **注意**: 完全な設定テンプレートは `config.example.json` を参照してください。\n\n**4. チャット**\n\n```bash\nmalikclaw agent -m \"What is 2+2?\"\n```\n\nこれだけです!2 分で AI アシスタントが動きます。\n\n---\n\n## 💬 チャットアプリ\n\nTelegram、Discord、QQ、DingTalk、LINE、WeCom で MalikClaw と会話できます\n\n| チャネル | セットアップ |\n|---------|------------|\n| **Telegram** | 簡単(トークンのみ) |\n| **Discord** | 簡単(Bot トークン + Intents) |\n| **QQ** | 簡単(AppID + AppSecret) |\n| **DingTalk** | 普通(アプリ認証情報) |\n| **LINE** | 普通(認証情報 + Webhook URL) |\n| **WeCom AI Bot** | 普通(Token + AES キー) |\n\n<details>\n<summary><b>Telegram</b>(推奨)</summary>\n\n**1. Bot を作成**\n\n- Telegram を開き、`@BotFather` を検索\n- `/newbot` を送信、プロンプトに従う\n- トークンをコピー\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> ユーザー ID は Telegram の `@userinfobot` から取得できます。\n\n**3. 起動**\n\n```bash\nmalikclaw gateway\n```\n</details>\n\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Bot を作成**\n- https://discord.com/developers/applications にアクセス\n- アプリケーションを作成 → Bot → Add Bot\n- Bot トークンをコピー\n\n**2. Intents を有効化**\n- Bot の設定画面で **MESSAGE CONTENT INTENT** を有効化\n- (任意)**SERVER MEMBERS INTENT** も有効化\n\n**3. ユーザー ID を取得**\n- Discord 設定 → 詳細設定 → **開発者モード** を有効化\n- 自分のアバターを右クリック → **ユーザーIDをコピー**\n\n**4. 設定**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Bot を招待**\n- OAuth2 → URL Generator\n- Scopes: `bot`\n- Bot Permissions: `Send Messages`, `Read Message History`\n- 生成された招待 URL を開き、サーバーに Bot を追加\n\n**6. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Bot を作成**\n\n- [QQ オープンプラットフォーム](https://q.qq.com/#) にアクセス\n- アプリケーションを作成 → **AppID** と **AppSecret** を取得\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> `allow_from` を空にすると全ユーザーを許可、QQ番号を指定してアクセス制限可能。\n\n**3. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Bot を作成**\n\n- [オープンプラットフォーム](https://open.dingtalk.com/) にアクセス\n- 内部アプリを作成\n- Client ID と Client Secret をコピー\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> `allow_from` を空にすると全ユーザーを許可、ユーザーIDを指定してアクセス制限可能。\n\n**3. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. LINE 公式アカウントを作成**\n\n- [LINE Developers Console](https://developers.line.biz/) にアクセス\n- プロバイダーを作成 → Messaging API チャネルを作成\n- **チャネルシークレット** と **チャネルアクセストークン** をコピー\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Webhook URL を設定**\n\nLINE の Webhook には HTTPS が必要です。リバースプロキシまたはトンネルを使用してください:\n\n```bash\n# ngrok の例\nngrok http 18790\n```\n\nLINE Developers Console で Webhook URL を `https://あなたのドメイン/webhook/line` に設定し、**Webhook の利用** を有効にしてください。\n\n> **注意**: LINE の Webhook は共有の Gateway HTTP サーバー(デフォルト: `127.0.0.1:18790`)で提供されます。ホストからアクセスする場合は Gateway のポートを公開するか、リバースプロキシを設定してください。\n\n**4. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n> グループチャットでは @メンション時のみ応答します。返信は元メッセージを引用する形式です。\n\n> **Docker Compose**: Gateway HTTP サーバーは共有の `127.0.0.1:18790` で Webhook を提供します。ホストからアクセスするには `malikclaw-gateway` サービスに `ports: [\"18790:18790\"]` を追加してください。\n\n</details>\n\n<details>\n<summary><b>WeCom (企業微信)</b></summary>\n\nMalikClaw は3種類の WeCom 統合をサポートしています:\n\n**オプション1: WeCom Bot (ロボット)** - 簡単な設定、グループチャット対応\n**オプション2: WeCom App (カスタムアプリ)** - より多機能、アクティブメッセージング対応、プライベートチャットのみ\n**オプション3: WeCom AI Bot (スマートボット)** - 公式 AI Bot、ストリーミング返信、グループ・プライベート両対応\n\n詳細な設定手順は [WeCom AI Bot Configuration Guide](docs/channels/wecom/wecom_aibot/README.zh.md) を参照してください。\n\n**クイックセットアップ - WeCom Bot:**\n\n**1. ボットを作成**\n\n* WeCom 管理コンソール → グループチャット → グループボットを追加\n* Webhook URL をコピー(形式: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n\n> **注意**: WeCom Bot の Webhook 受信は共有の Gateway HTTP サーバー(デフォルト: `127.0.0.1:18790`)で提供されます。ホストからアクセスする場合は Gateway のポートを公開するか、HTTPS 用のリバースプロキシを設定してください。\n```\n\n**クイックセットアップ - WeCom App:**\n\n**1. アプリを作成**\n\n* WeCom 管理コンソール → アプリ管理 → アプリを作成\n* **AgentId** と **Secret** をコピー\n* \"マイ会社\" ページで **CorpID** をコピー\n\n**2. メッセージ受信を設定**\n\n* アプリ詳細で \"メッセージを受信\" → \"APIを設定\" をクリック\n* URL を `http://your-server:18790/webhook/wecom-app` に設定\n* **Token** と **EncodingAESKey** を生成\n\n**3. 設定**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n> **注意**: WeCom App の Webhook コールバックは共有の Gateway HTTP サーバー(デフォルト: `127.0.0.1:18790`)で提供されます。ホストからアクセスする場合は HTTPS 用のリバースプロキシを設定してください。\n\n**クイックセットアップ - WeCom AI Bot:**\n\n**1. AI Bot を作成**\n\n* WeCom 管理コンソール → アプリ管理 → AI Bot\n* コールバック URL を設定: `http://your-server:18791/webhook/wecom-aibot`\n* **Token** をコピーし、**EncodingAESKey** を生成\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"こんにちは!何かお手伝いできますか?\"\n }\n }\n}\n```\n\n**3. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n> **注意**: WeCom AI Bot はストリーミングプルプロトコルを使用 — 返信タイムアウトの心配なし。長時間タスク(>30秒)は自動的に `response_url` によるプッシュ配信に切り替わります。\n\n</details>\n\n## ⚙️ 設定\n\n設定ファイル: `~/.malikclaw/config.json`\n\n### 環境変数\n\n環境変数を使用してデフォルトのパスを上書きできます。これは、ポータブルインストール、コンテナ化されたデプロイメント、または malikclaw をシステムサービスとして実行する場合に便利です。これらの変数は独立しており、異なるパスを制御します。\n\n| 変数 | 説明 | デフォルトパス |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | 設定ファイルへのパスを上書きします。これにより、malikclaw は他のすべての場所を無視して、指定された `config.json` をロードします。 | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | malikclaw データのルートディレクトリを上書きします。これにより、`workspace` やその他のデータディレクトリのデフォルトの場所が変更されます。 | `~/.malikclaw` |\n\n**例:**\n\n```bash\n# 特定の設定ファイルを使用して malikclaw を実行する\n# ワークスペースのパスはその設定ファイル内から読み込まれます\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# すべてのデータを /opt/malikclaw に保存して malikclaw を実行する\n# 設定はデフォルトの ~/.malikclaw/config.json からロードされます\n# ワークスペースは /opt/malikclaw/workspace に作成されます\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# 両方を使用して完全にカスタマイズされたセットアップを行う\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### ワークスペース構成\n\nMalikClaw は設定されたワークスペース(デフォルト: `~/.malikclaw/workspace`)にデータを保存します:\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # 会話セッションと履歴\n├── memory/ # 長期メモリ(MEMORY.md)\n├── state/ # 永続状態(最後のチャネルなど)\n├── cron/ # スケジュールジョブデータベース\n├── skills/ # カスタムスキル\n├── AGENTS.md # エージェントの行動ガイド\n├── HEARTBEAT.md # 定期タスクプロンプト(30分ごとに確認)\n├── IDENTITY.md # エージェントのアイデンティティ\n├── SOUL.md # エージェントのソウル\n└── USER.md # ユーザー設定\n```\n\n### 🔒 セキュリティサンドボックス\n\nMalikClaw はデフォルトでサンドボックス環境で実行されます。エージェントは設定されたワークスペース内のファイルにのみアクセスし、コマンドを実行できます。\n\n#### デフォルト設定\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| オプション | デフォルト | 説明 |\n|-----------|-----------|------|\n| `workspace` | `~/.malikclaw/workspace` | エージェントの作業ディレクトリ |\n| `restrict_to_workspace` | `true` | ファイル/コマンドアクセスをワークスペースに制限 |\n\n#### 保護対象ツール\n\n`restrict_to_workspace: true` の場合、以下のツールがサンドボックス化されます:\n\n| ツール | 機能 | 制限 |\n|-------|------|------|\n| `read_file` | ファイル読み込み | ワークスペース内のファイルのみ |\n| `write_file` | ファイル書き込み | ワークスペース内のファイルのみ |\n| `list_dir` | ディレクトリ一覧 | ワークスペース内のディレクトリのみ |\n| `edit_file` | ファイル編集 | ワークスペース内のファイルのみ |\n| `append_file` | ファイル追記 | ワークスペース内のファイルのみ |\n| `exec` | コマンド実行 | コマンドパスはワークスペース内である必要あり |\n\n#### exec ツールの追加保護\n\n`restrict_to_workspace: false` でも、`exec` ツールは以下の危険なコマンドをブロックします:\n\n- `rm -rf`, `del /f`, `rmdir /s` — 一括削除\n- `format`, `mkfs`, `diskpart` — ディスクフォーマット\n- `dd if=` — ディスクイメージング\n- `/dev/sd[a-z]` への書き込み — 直接ディスク書き込み\n- `shutdown`, `reboot`, `poweroff` — システムシャットダウン\n- フォークボム `:(){ :|:& };:`\n\n#### エラー例\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### 制限の無効化(セキュリティリスク)\n\nエージェントにワークスペース外のパスへのアクセスが必要な場合:\n\n**方法1: 設定ファイル**\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**方法2: 環境変数**\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **警告**: この制限を無効にすると、エージェントはシステム上の任意のパスにアクセスできるようになります。制御された環境でのみ慎重に使用してください。\n\n#### セキュリティ境界の一貫性\n\n`restrict_to_workspace` 設定は、すべての実行パスで一貫して適用されます:\n\n| 実行パス | セキュリティ境界 |\n|---------|-----------------|\n| メインエージェント | `restrict_to_workspace` ✅ |\n| サブエージェント / Spawn | 同じ制限を継承 ✅ |\n| ハートビートタスク | 同じ制限を継承 ✅ |\n\nすべてのパスで同じワークスペース制限が適用されます — サブエージェントやスケジュールタスクを通じてセキュリティ境界をバイパスする方法はありません。\n\n### ハートビート(定期タスク)\n\nMalikClaw は自動的に定期タスクを実行できます。ワークスペースに `HEARTBEAT.md` ファイルを作成します:\n\n```markdown\n# 定期タスク\n\n- 重要なメールをチェック\n- 今後の予定を確認\n- 天気予報をチェック\n```\n\nエージェントは30分ごと(設定可能)にこのファイルを読み込み、利用可能なツールを使ってタスクを実行します。\n\n#### spawn で非同期タスク実行\n\n時間のかかるタスク(Web検索、API呼び出し)には `spawn` ツールを使って**サブエージェント**を作成します:\n\n```markdown\n# 定期タスク\n\n## クイックタスク(直接応答)\n- 現在時刻を報告\n\n## 長時間タスク(spawn で非同期)\n- AIニュースを検索して要約\n- メールをチェックして重要なメッセージを報告\n```\n\n**主な特徴:**\n\n| 機能 | 説明 |\n|------|------|\n| **spawn** | 非同期サブエージェントを作成、ハートビートをブロックしない |\n| **独立コンテキスト** | サブエージェントは独自のコンテキストを持ち、セッション履歴なし |\n| **message ツール** | サブエージェントは message ツールで直接ユーザーと通信 |\n| **非ブロッキング** | spawn 後、ハートビートは次のタスクへ継続 |\n\n#### サブエージェントの通信方法\n\n```\nハートビート発動\n ↓\nエージェントが HEARTBEAT.md を読む\n ↓\n長いタスク: spawn サブエージェント\n ↓ ↓\n次のタスクへ継続 サブエージェントが独立して動作\n ↓ ↓\n全タスク完了 message ツールを使用\n ↓ ↓\nHEARTBEAT_OK 応答 ユーザーが直接結果を受け取る\n```\n\nサブエージェントはツール(message、web_search など)にアクセスでき、メインエージェントを経由せずにユーザーと通信できます。\n\n**設定:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| オプション | デフォルト | 説明 |\n|-----------|-----------|------|\n| `enabled` | `true` | ハートビートの有効/無効 |\n| `interval` | `30` | チェック間隔(分)、最小5分 |\n\n**環境変数:**\n- `MALIKCLAW_HEARTBEAT_ENABLED=false` で無効化\n- `MALIKCLAW_HEARTBEAT_INTERVAL=60` で間隔変更\n\n### プロバイダー\n\n> [!NOTE]\n> Groq は Whisper による無料の音声文字起こしを提供しています。設定すると、あらゆるチャンネルからの音声メッセージがエージェントレベルで自動的に文字起こしされます。\n\n| プロバイダー | 用途 | API キー取得先 |\n| --- | --- | --- |\n| `gemini` | LLM(Gemini 直接) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM(Zhipu 直接) | [bigmodel.cn](https://bigmodel.cn) |\n| `volcengine` | LLM(Volcengine 直接) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter`(要テスト) | LLM(推奨、全モデルにアクセス可能) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic`(要テスト) | LLM(Claude 直接) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai`(要テスト) | LLM(GPT 直接) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek`(要テスト) | LLM(DeepSeek 直接) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `groq` | LLM + **音声文字起こし**(Whisper) | [console.groq.com](https://console.groq.com) |\n| `cerebras` | LLM(Cerebras 直接) | [cerebras.ai](https://cerebras.ai) |\n\n### 基本設定\n\n1. **設定ファイルの作成:**\n\n ```bash\n cp config.example.json config/config.json\n ```\n\n2. **設定の編集:**\n\n ```json\n {\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-...\"\n }\n },\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_DISCORD_BOT_TOKEN\"\n }\n }\n }\n ```\n\n3. **実行**\n\n ```bash\n malikclaw agent -m \"Hello\"\n ```\n</details>\n\n<details>\n<summary><b>完全な設定例</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"search\": {\n \"api_key\": \"BSA...\"\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### モデル設定 (model_list)\n\n> **新機能!** MalikClaw は現在 **モデル中心** の設定アプローチを採用しています。`ベンダー/モデル` 形式(例: `zhipu/glm-4.7`)を指定するだけで、新しいプロバイダーを追加できます—**コードの変更は一切不要!**\n\nこの設計は、柔軟なプロバイダー選択による **マルチエージェントサポート** も可能にします:\n\n- **異なるエージェント、異なるプロバイダー** : 各エージェントは独自の LLM プロバイダーを使用可能\n- **フォールバックモデル** : 耐障性のため、プライマリモデルとフォールバックモデルを設定可能\n- **ロードバランシング** : 複数のエンドポイントにリクエストを分散\n- **集中設定管理** : すべてのプロバイダーを一箇所で管理\n\n#### 📋 サポートされているすべてのベンダー\n\n| ベンダー | `model` プレフィックス | デフォルト API Base | プロトコル | API キー |\n|-------------|-----------------|---------------------|----------|---------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [キーを取得](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [キーを取得](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [キーを取得](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [キーを取得](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [キーを取得](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [キーを取得](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [キーを取得](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [キーを取得](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [キーを取得](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | ローカル(キー不要) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [キーを取得](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | ローカル |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [キーを取得](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [キーを取得](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [キーを取得](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [キーを取得](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [トークンを取得](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | カスタム | OAuthのみ |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### 基本設定\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### ベンダー別の例\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (OAuth使用)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> OAuth認証を設定するには、`malikclaw auth login --provider anthropic` を実行してください。\n\n**カスタムプロキシ/API**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### ロードバランシング\n\n同じモデル名で複数のエンドポイントを設定すると、MalikClaw が自動的にラウンドロビンで分散します:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### 従来の `providers` 設定からの移行\n\n古い `providers` 設定は**非推奨**ですが、後方互換性のためにサポートされています。\n\n**旧設定(非推奨):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**新設定(推奨):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n詳細な移行ガイドは、[docs/migration/model-list-migration.md](docs/migration/model-list-migration.md) を参照してください。\n\n## CLI リファレンス\n\n| コマンド | 説明 |\n|---------|------|\n| `malikclaw onboard` | 設定&ワークスペースの初期化 |\n| `malikclaw agent -m \"...\"` | エージェントとチャット |\n| `malikclaw agent` | インタラクティブチャットモード |\n| `malikclaw gateway` | ゲートウェイを起動 |\n| `malikclaw status` | ステータスを表示 |\n\n## 🤝 コントリビュート&ロードマップ\n\nPR 歓迎!コードベースは意図的に小さく読みやすくしています。🤗\n\nDiscord: https://discord.gg/V4sAZ9XWpN\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n\n## 🐛 トラブルシューティング\n\n### Web 検索で「API 設定の問題」と表示される\n\n検索 API キーをまだ設定していない場合、これは正常です。MalikClaw は手動検索用の便利なリンクを提供します。\n\nWeb 検索を有効にするには:\n1. [https://tavily.com](https://tavily.com) (月 1000 クエリ無料) または [https://brave.com/search/api](https://brave.com/search/api) で無料の API キーを取得(月 2000 クエリ無料)\n2. `~/.malikclaw/config.json` に追加:\n ```json\n {\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": true,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n }\n ```\n\n### コンテンツフィルタリングエラーが出る\n\n一部のプロバイダー(Zhipu など)にはコンテンツフィルタリングがあります。クエリを言い換えるか、別のモデルを使用してください。\n\n### Telegram Bot で「Conflict: terminated by other getUpdates」と表示される\n\n別のインスタンスが実行中の場合に発生します。`malikclaw gateway` が 1 つだけ実行されていることを確認してください。\n\n---\n\n## 📝 API キー比較\n\n| サービス | 無料枠 | ユースケース |\n|---------|--------|------------|\n| **OpenRouter** | 月 200K トークン | 複数モデル(Claude, GPT-4 など) |\n| **Volcengine CodingPlan** | 9.9元/初月 | 中国ユーザーに最適、複数のSOTAモデル(Doubao、DeepSeek等) |\n| **Zhipu** | 月 200K トークン | 中国ユーザーに適している |\n| **Qwen** | 無料枠あり | 通義千問 (Qwen) |\n| **Brave Search** | 月 2000 クエリ | Web 検索機能 |\n| **Tavily** | 月 1000 クエリ | AI エージェント検索最適化 |\n| **Groq** | 無料枠あり | 高速推論(Llama, Mixtral) |\n| **Cerebras** | 無料枠あり | 高速推論(Llama, Qwen など) |\n| **ModelScope** | 1 日 2000 リクエスト | 無料推論(Qwen, GLM, DeepSeek など) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "0a3535b70975f84f53461b2d904ee3cf40fbe294": {"t": 1785846843.3570933, "n": 31084, "h": "3fa199c515f89680", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Ultra-Efficient Personal AI Assistant for Edge Hardware</h3>\n <p><strong>$10 Hardware · &lt;10MB RAM · &lt;1s Boot · آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Multi-Architecture Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/pulls\"><img src=\"https://img.shields.io/github/issues-pr/AbdullahMalik17/malikclaw\" alt=\"GitHub pull requests\"></a>\n <br>\n <img src=\"https://img.shields.io/github/languages/code-size/AbdullahMalik17/malikclaw\" alt=\"GitHub code size\">\n <img src=\"https://img.shields.io/github/contributors/AbdullahMalik17/malikclaw\" alt=\"GitHub contributors\">\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n[اردو](README.ur.md) | **日本語** | [Português](README.pt-br.md) | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 重要更新情報(2026 年 3 月)**\n>\n> この翻訳は古くなっている可能性があります。最新情報は英語版をご覧ください:**[README.md](README.md)**\n>\n> **新機能:** プロダクショングレードのエージェントループ(PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE)。詳細は [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 MalikClaw は [nanobot](https://github.com/HKUDS/nanobot) にインスパイアされた超軽量パーソナル AI アシスタントです。Go でゼロからリファクタリングされ、AI エージェント自身がアーキテクチャの移行とコード最適化を推進するセルフブートストラッピングプロセスで構築されました。\n\n⚡️ $10 のハードウェアで 10MB 未満の RAM で動作:OpenClaw より 99% 少ないメモリ、Mac mini より 98% 安い!\n\n<table align=\"center\">\n <tr align=\"center\">\n <td align=\"center\" valign=\"top\">\n <p align=\"center\">\n <img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n </p>\n </td>\n <td align=\"center\" valign=\"top\">\n <p align=\"center\">\n <img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n </p>\n </td>\n </tr>\n</table>\n\n## 📢 ニュース\n2026-02-09 🎉 MalikClaw リリース!$10 ハードウェアで 10MB 未満の RAM で動く AI エージェントを 1 日で構築。🦐 行くぜ、シャコ!\n\n## ✨ 特徴\n\n🪶 **超軽量**: メモリフットプリント 10MB 未満 — Clawdbot のコア機能より 99% 小さい。\n\n💰 **最小コスト**: $10 ハードウェアで動作 — Mac mini より 98% 安い。\n\n⚡️ **超高速**: 起動時間 400 倍高速、0.6GHz シングルコアでも 1 秒で起動。\n\n🌍 **真のポータビリティ**: RISC-V、ARM、MIPS、x86 対応の単一バイナリ。ワンクリックで Go!\n\n🤖 **AI ブートストラップ**: 自律的な Go ネイティブ実装 — コアの 95% が AI 生成、人間によるレビュー付き。\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 デモンストレーション\n### 🛠️ スタンダードアシスタントワークフロー\n<table align=\"center\">\n <tr align=\"center\">\n <th><p align=\"center\">🧩 フルスタックエンジニア</p></th>\n <th><p align=\"center\">🗂️ ログ&計画管理</p></th>\n <th><p align=\"center\">🔎 Web 検索&学習</p></th>\n </tr>\n <tr>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n </tr>\n <tr>\n <td align=\"center\">開発 · デプロイ · スケール</td>\n <td align=\"center\">スケジュール · 自動化 · メモリ</td>\n <td align=\"center\">発見 · インサイト · トレンド</td>\n </tr>\n</table>\n\n### 🐜 革新的な省フットプリントデプロイ\nMalikClaw はほぼすべての Linux デバイスにデプロイできます!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) または W(WiFi6) バージョン、最小ホームアシスタントに\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html) または $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) サーバー自動メンテナンスに\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) または $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) スマート監視に\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 もっと多くのデプロイ事例が待っています!\n\n## 📦 インストール\n\n### コンパイル済みバイナリでインストール\n\n[リリースページ](https://github.com/AbdullahMalik17/malikclaw/releases) からお使いのプラットフォーム用のファームウェアをダウンロードしてください。\n\n### ソースからインストール(最新機能、開発向け推奨)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# ビルド(インストール不要)\nmake build\n\n# 複数プラットフォーム向けビルド\nmake build-all\n\n# ビルドとインストール\nmake install\n```\n\n## 🐳 Docker Compose\n\nDocker Compose を使えば、ローカルにインストールせずに MalikClaw を実行できます。\n\n```bash\n# 1. リポジトリをクローン\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. 初回起動 — docker/data/config.json を自動生成して終了\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# コンテナが \"First-run setup complete.\" を表示して停止します。\n\n# 3. API キーを設定\nvim docker/data/config.json # プロバイダー API キー、Bot トークンなどを設定\n\n# 4. 起動\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Docker ユーザー**: デフォルトでは、Gateway は `127.0.0.1` でリッスンしており、ホストからアクセスできません。ヘルスチェックエンドポイントにアクセスしたり、ポートを公開したりする必要がある場合は、環境変数で `MALIKCLAW_GATEWAY_HOST=0.0.0.0` を設定するか、`config.json` を更新してください。\n\n```bash\n# 5. ログ確認\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. 停止\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Agent モード(ワンショット)\n\n```bash\n# 質問を投げる\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"What is 2+2?\"\n\n# インタラクティブモード\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### アップデート\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 クイックスタート(ネイティブ)\n\n> [!TIP]\n> `~/.malikclaw/config.json` に API キーを設定してください。API キーの取得先: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)。Web 検索は **任意** です — 無料の [Tavily API](https://tavily.com) (月 1000 クエリ無料) または [Brave Search API](https://brave.com/search/api) (月 2000 クエリ無料)。\n\n**1. 初期化**\n\n```bash\nmalikclaw onboard\n```\n\n**2. 設定** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_TELEGRAM_BOT_TOKEN\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"search\": {\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"tavily\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_TAVILY_API_KEY\",\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n> **新機能**: `model_list` 形式により、プロバイダーをコード変更なしで追加できます。詳細は [モデル設定](#モデル設定-model_list) を参照してください。\n> `request_timeout` は任意の秒単位設定です。省略または `<= 0` の場合、MalikClaw はデフォルトのタイムアウト(120秒)を使用します。\n\n**3. API キーの取得**\n\n- **LLM プロバイダー**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n- **Web 検索**(任意): [Tavily](https://tavily.com) - AI エージェント向けに最適化 (月 1000 リクエスト) · [Brave Search](https://brave.com/search/api) - 無料枠あり(月 2000 リクエスト)\n\n> **注意**: 完全な設定テンプレートは `config.example.json` を参照してください。\n\n**4. チャット**\n\n```bash\nmalikclaw agent -m \"What is 2+2?\"\n```\n\nこれだけです!2 分で AI アシスタントが動きます。\n\n---\n\n## 💬 チャットアプリ\n\nTelegram、Discord、QQ、DingTalk、LINE、WeCom で MalikClaw と会話できます\n\n| チャネル | セットアップ |\n|---------|------------|\n| **Telegram** | 簡単(トークンのみ) |\n| **Discord** | 簡単(Bot トークン + Intents) |\n| **QQ** | 簡単(AppID + AppSecret) |\n| **DingTalk** | 普通(アプリ認証情報) |\n| **LINE** | 普通(認証情報 + Webhook URL) |\n| **WeCom AI Bot** | 普通(Token + AES キー) |\n\n<details>\n<summary><b>Telegram</b>(推奨)</summary>\n\n**1. Bot を作成**\n\n- Telegram を開き、`@BotFather` を検索\n- `/newbot` を送信、プロンプトに従う\n- トークンをコピー\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> ユーザー ID は Telegram の `@userinfobot` から取得できます。\n\n**3. 起動**\n\n```bash\nmalikclaw gateway\n```\n</details>\n\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Bot を作成**\n- https://discord.com/developers/applications にアクセス\n- アプリケーションを作成 → Bot → Add Bot\n- Bot トークンをコピー\n\n**2. Intents を有効化**\n- Bot の設定画面で **MESSAGE CONTENT INTENT** を有効化\n- (任意)**SERVER MEMBERS INTENT** も有効化\n\n**3. ユーザー ID を取得**\n- Discord 設定 → 詳細設定 → **開発者モード** を有効化\n- 自分のアバターを右クリック → **ユーザーIDをコピー**\n\n**4. 設定**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Bot を招待**\n- OAuth2 → URL Generator\n- Scopes: `bot`\n- Bot Permissions: `Send Messages`, `Read Message History`\n- 生成された招待 URL を開き、サーバーに Bot を追加\n\n**6. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Bot を作成**\n\n- [QQ オープンプラットフォーム](https://q.qq.com/#) にアクセス\n- アプリケーションを作成 → **AppID** と **AppSecret** を取得\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> `allow_from` を空にすると全ユーザーを許可、QQ番号を指定してアクセス制限可能。\n\n**3. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Bot を作成**\n\n- [オープンプラットフォーム](https://open.dingtalk.com/) にアクセス\n- 内部アプリを作成\n- Client ID と Client Secret をコピー\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> `allow_from` を空にすると全ユーザーを許可、ユーザーIDを指定してアクセス制限可能。\n\n**3. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. LINE 公式アカウントを作成**\n\n- [LINE Developers Console](https://developers.line.biz/) にアクセス\n- プロバイダーを作成 → Messaging API チャネルを作成\n- **チャネルシークレット** と **チャネルアクセストークン** をコピー\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Webhook URL を設定**\n\nLINE の Webhook には HTTPS が必要です。リバースプロキシまたはトンネルを使用してください:\n\n```bash\n# ngrok の例\nngrok http 18790\n```\n\nLINE Developers Console で Webhook URL を `https://あなたのドメイン/webhook/line` に設定し、**Webhook の利用** を有効にしてください。\n\n> **注意**: LINE の Webhook は共有の Gateway HTTP サーバー(デフォルト: `127.0.0.1:18790`)で提供されます。ホストからアクセスする場合は Gateway のポートを公開するか、リバースプロキシを設定してください。\n\n**4. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n> グループチャットでは @メンション時のみ応答します。返信は元メッセージを引用する形式です。\n\n> **Docker Compose**: Gateway HTTP サーバーは共有の `127.0.0.1:18790` で Webhook を提供します。ホストからアクセスするには `malikclaw-gateway` サービスに `ports: [\"18790:18790\"]` を追加してください。\n\n</details>\n\n<details>\n<summary><b>WeCom (企業微信)</b></summary>\n\nMalikClaw は3種類の WeCom 統合をサポートしています:\n\n**オプション1: WeCom Bot (ロボット)** - 簡単な設定、グループチャット対応\n**オプション2: WeCom App (カスタムアプリ)** - より多機能、アクティブメッセージング対応、プライベートチャットのみ\n**オプション3: WeCom AI Bot (スマートボット)** - 公式 AI Bot、ストリーミング返信、グループ・プライベート両対応\n\n詳細な設定手順は [WeCom AI Bot Configuration Guide](docs/channels/wecom/wecom_aibot/README.zh.md) を参照してください。\n\n**クイックセットアップ - WeCom Bot:**\n\n**1. ボットを作成**\n\n* WeCom 管理コンソール → グループチャット → グループボットを追加\n* Webhook URL をコピー(形式: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n\n> **注意**: WeCom Bot の Webhook 受信は共有の Gateway HTTP サーバー(デフォルト: `127.0.0.1:18790`)で提供されます。ホストからアクセスする場合は Gateway のポートを公開するか、HTTPS 用のリバースプロキシを設定してください。\n```\n\n**クイックセットアップ - WeCom App:**\n\n**1. アプリを作成**\n\n* WeCom 管理コンソール → アプリ管理 → アプリを作成\n* **AgentId** と **Secret** をコピー\n* \"マイ会社\" ページで **CorpID** をコピー\n\n**2. メッセージ受信を設定**\n\n* アプリ詳細で \"メッセージを受信\" → \"APIを設定\" をクリック\n* URL を `http://your-server:18790/webhook/wecom-app` に設定\n* **Token** と **EncodingAESKey** を生成\n\n**3. 設定**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n> **注意**: WeCom App の Webhook コールバックは共有の Gateway HTTP サーバー(デフォルト: `127.0.0.1:18790`)で提供されます。ホストからアクセスする場合は HTTPS 用のリバースプロキシを設定してください。\n\n**クイックセットアップ - WeCom AI Bot:**\n\n**1. AI Bot を作成**\n\n* WeCom 管理コンソール → アプリ管理 → AI Bot\n* コールバック URL を設定: `http://your-server:18791/webhook/wecom-aibot`\n* **Token** をコピーし、**EncodingAESKey** を生成\n\n**2. 設定**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"こんにちは!何かお手伝いできますか?\"\n }\n }\n}\n```\n\n**3. 起動**\n\n```bash\nmalikclaw gateway\n```\n\n> **注意**: WeCom AI Bot はストリーミングプルプロトコルを使用 — 返信タイムアウトの心配なし。長時間タスク(>30秒)は自動的に `response_url` によるプッシュ配信に切り替わります。\n\n</details>\n\n## ⚙️ 設定\n\n設定ファイル: `~/.malikclaw/config.json`\n\n### 環境変数\n\n環境変数を使用してデフォルトのパスを上書きできます。これは、ポータブルインストール、コンテナ化されたデプロイメント、または malikclaw をシステムサービスとして実行する場合に便利です。これらの変数は独立しており、異なるパスを制御します。\n\n| 変数 | 説明 | デフォルトパス |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | 設定ファイルへのパスを上書きします。これにより、malikclaw は他のすべての場所を無視して、指定された `config.json` をロードします。 | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | malikclaw データのルートディレクトリを上書きします。これにより、`workspace` やその他のデータディレクトリのデフォルトの場所が変更されます。 | `~/.malikclaw` |\n\n**例:**\n\n```bash\n# 特定の設定ファイルを使用して malikclaw を実行する\n# ワークスペースのパスはその設定ファイル内から読み込まれます\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# すべてのデータを /opt/malikclaw に保存して malikclaw を実行する\n# 設定はデフォルトの ~/.malikclaw/config.json からロードされます\n# ワークスペースは /opt/malikclaw/workspace に作成されます\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# 両方を使用して完全にカスタマイズされたセットアップを行う\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### ワークスペース構成\n\nMalikClaw は設定されたワークスペース(デフォルト: `~/.malikclaw/workspace`)にデータを保存します:\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # 会話セッションと履歴\n├── memory/ # 長期メモリ(MEMORY.md)\n├── state/ # 永続状態(最後のチャネルなど)\n├── cron/ # スケジュールジョブデータベース\n├── skills/ # カスタムスキル\n├── AGENTS.md # エージェントの行動ガイド\n├── HEARTBEAT.md # 定期タスクプロンプト(30分ごとに確認)\n├── IDENTITY.md # エージェントのアイデンティティ\n├── SOUL.md # エージェントのソウル\n└── USER.md # ユーザー設定\n```\n\n### 🔒 セキュリティサンドボックス\n\nMalikClaw はデフォルトでサンドボックス環境で実行されます。エージェントは設定されたワークスペース内のファイルにのみアクセスし、コマンドを実行できます。\n\n#### デフォルト設定\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| オプション | デフォルト | 説明 |\n|-----------|-----------|------|\n| `workspace` | `~/.malikclaw/workspace` | エージェントの作業ディレクトリ |\n| `restrict_to_workspace` | `true` | ファイル/コマンドアクセスをワークスペースに制限 |\n\n#### 保護対象ツール\n\n`restrict_to_workspace: true` の場合、以下のツールがサンドボックス化されます:\n\n| ツール | 機能 | 制限 |\n|-------|------|------|\n| `read_file` | ファイル読み込み | ワークスペース内のファイルのみ |\n| `write_file` | ファイル書き込み | ワークスペース内のファイルのみ |\n| `list_dir` | ディレクトリ一覧 | ワークスペース内のディレクトリのみ |\n| `edit_file` | ファイル編集 | ワークスペース内のファイルのみ |\n| `append_file` | ファイル追記 | ワークスペース内のファイルのみ |\n| `exec` | コマンド実行 | コマンドパスはワークスペース内である必要あり |\n\n#### exec ツールの追加保護\n\n`restrict_to_workspace: false` でも、`exec` ツールは以下の危険なコマンドをブロックします:\n\n- `rm -rf`, `del /f`, `rmdir /s` — 一括削除\n- `format`, `mkfs`, `diskpart` — ディスクフォーマット\n- `dd if=` — ディスクイメージング\n- `/dev/sd[a-z]` への書き込み — 直接ディスク書き込み\n- `shutdown`, `reboot`, `poweroff` — システムシャットダウン\n- フォークボム `:(){ :|:& };:`\n\n#### エラー例\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### 制限の無効化(セキュリティリスク)\n\nエージェントにワークスペース外のパスへのアクセスが必要な場合:\n\n**方法1: 設定ファイル**\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**方法2: 環境変数**\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **警告**: この制限を無効にすると、エージェントはシステム上の任意のパスにアクセスできるようになります。制御された環境でのみ慎重に使用してください。\n\n#### セキュリティ境界の一貫性\n\n`restrict_to_workspace` 設定は、すべての実行パスで一貫して適用されます:\n\n| 実行パス | セキュリティ境界 |\n|---------|-----------------|\n| メインエージェント | `restrict_to_workspace` ✅ |\n| サブエージェント / Spawn | 同じ制限を継承 ✅ |\n| ハートビートタスク | 同じ制限を継承 ✅ |\n\nすべてのパスで同じワークスペース制限が適用されます — サブエージェントやスケジュールタスクを通じてセキュリティ境界をバイパスする方法はありません。\n\n### ハートビート(定期タスク)\n\nMalikClaw は自動的に定期タスクを実行できます。ワークスペースに `HEARTBEAT.md` ファイルを作成します:\n\n```markdown\n# 定期タスク\n\n- 重要なメールをチェック\n- 今後の予定を確認\n- 天気予報をチェック\n```\n\nエージェントは30分ごと(設定可能)にこのファイルを読み込み、利用可能なツールを使ってタスクを実行します。\n\n#### spawn で非同期タスク実行\n\n時間のかかるタスク(Web検索、API呼び出し)には `spawn` ツールを使って**サブエージェント**を作成します:\n\n```markdown\n# 定期タスク\n\n## クイックタスク(直接応答)\n- 現在時刻を報告\n\n## 長時間タスク(spawn で非同期)\n- AIニュースを検索して要約\n- メールをチェックして重要なメッセージを報告\n```\n\n**主な特徴:**\n\n| 機能 | 説明 |\n|------|------|\n| **spawn** | 非同期サブエージェントを作成、ハートビートをブロックしない |\n| **独立コンテキスト** | サブエージェントは独自のコンテキストを持ち、セッション履歴なし |\n| **message ツール** | サブエージェントは message ツールで直接ユーザーと通信 |\n| **非ブロッキング** | spawn 後、ハートビートは次のタスクへ継続 |\n\n#### サブエージェントの通信方法\n\n```\nハートビート発動\n ↓\nエージェントが HEARTBEAT.md を読む\n ↓\n長いタスク: spawn サブエージェント\n ↓ ↓\n次のタスクへ継続 サブエージェントが独立して動作\n ↓ ↓\n全タスク完了 message ツールを使用\n ↓ ↓\nHEARTBEAT_OK 応答 ユーザーが直接結果を受け取る\n```\n\nサブエージェントはツール(message、web_search など)にアクセスでき、メインエージェントを経由せずにユーザーと通信できます。\n\n**設定:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| オプション | デフォルト | 説明 |\n|-----------|-----------|------|\n| `enabled` | `true` | ハートビートの有効/無効 |\n| `interval` | `30` | チェック間隔(分)、最小5分 |\n\n**環境変数:**\n- `MALIKCLAW_HEARTBEAT_ENABLED=false` で無効化\n- `MALIKCLAW_HEARTBEAT_INTERVAL=60` で間隔変更\n\n### プロバイダー\n\n> [!NOTE]\n> Groq は Whisper による無料の音声文字起こしを提供しています。設定すると、あらゆるチャンネルからの音声メッセージがエージェントレベルで自動的に文字起こしされます。\n\n| プロバイダー | 用途 | API キー取得先 |\n| --- | --- | --- |\n| `gemini` | LLM(Gemini 直接) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM(Zhipu 直接) | [bigmodel.cn](https://bigmodel.cn) |\n| `volcengine` | LLM(Volcengine 直接) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter`(要テスト) | LLM(推奨、全モデルにアクセス可能) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic`(要テスト) | LLM(Claude 直接) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai`(要テスト) | LLM(GPT 直接) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek`(要テスト) | LLM(DeepSeek 直接) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `groq` | LLM + **音声文字起こし**(Whisper) | [console.groq.com](https://console.groq.com) |\n| `cerebras` | LLM(Cerebras 直接) | [cerebras.ai](https://cerebras.ai) |\n\n### 基本設定\n\n1. **設定ファイルの作成:**\n\n ```bash\n cp config.example.json config/config.json\n ```\n\n2. **設定の編集:**\n\n ```json\n {\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-...\"\n }\n },\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_DISCORD_BOT_TOKEN\"\n }\n }\n }\n ```\n\n3. **実行**\n\n ```bash\n malikclaw agent -m \"Hello\"\n ```\n</details>\n\n<details>\n<summary><b>完全な設定例</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"search\": {\n \"api_key\": \"BSA...\"\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### モデル設定 (model_list)\n\n> **新機能!** MalikClaw は現在 **モデル中心** の設定アプローチを採用しています。`ベンダー/モデル` 形式(例: `zhipu/glm-4.7`)を指定するだけで、新しいプロバイダーを追加できます—**コードの変更は一切不要!**\n\nこの設計は、柔軟なプロバイダー選択による **マルチエージェントサポート** も可能にします:\n\n- **異なるエージェント、異なるプロバイダー** : 各エージェントは独自の LLM プロバイダーを使用可能\n- **フォールバックモデル** : 耐障性のため、プライマリモデルとフォールバックモデルを設定可能\n- **ロードバランシング** : 複数のエンドポイントにリクエストを分散\n- **集中設定管理** : すべてのプロバイダーを一箇所で管理\n\n#### 📋 サポートされているすべてのベンダー\n\n| ベンダー | `model` プレフィックス | デフォルト API Base | プロトコル | API キー |\n|-------------|-----------------|---------------------|----------|---------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [キーを取得](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [キーを取得](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [キーを取得](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [キーを取得](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [キーを取得](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [キーを取得](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [キーを取得](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [キーを取得](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [キーを取得](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | ローカル(キー不要) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [キーを取得](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | ローカル |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [キーを取得](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [キーを取得](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [キーを取得](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [キーを取得](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [トークンを取得](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | カスタム | OAuthのみ |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### 基本設定\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### ベンダー別の例\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (OAuth使用)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> OAuth認証を設定するには、`malikclaw auth login --provider anthropic` を実行してください。\n\n**カスタムプロキシ/API**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### ロードバランシング\n\n同じモデル名で複数のエンドポイントを設定すると、MalikClaw が自動的にラウンドロビンで分散します:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### 従来の `providers` 設定からの移行\n\n古い `providers` 設定は**非推奨**ですが、後方互換性のためにサポートされています。\n\n**旧設定(非推奨):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**新設定(推奨):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n詳細な移行ガイドは、[docs/migration/model-list-migration.md](docs/migration/model-list-migration.md) を参照してください。\n\n## CLI リファレンス\n\n| コマンド | 説明 |\n|---------|------|\n| `malikclaw onboard` | 設定&ワークスペースの初期化 |\n| `malikclaw agent -m \"...\"` | エージェントとチャット |\n| `malikclaw agent` | インタラクティブチャットモード |\n| `malikclaw gateway` | ゲートウェイを起動 |\n| `malikclaw status` | ステータスを表示 |\n\n## 🤝 コントリビュート&ロードマップ\n\nPR 歓迎!コードベースは意図的に小さく読みやすくしています。🤗\n\nDiscord: https://discord.gg/V4sAZ9XWpN\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n\n## 🐛 トラブルシューティング\n\n### Web 検索で「API 設定の問題」と表示される\n\n検索 API キーをまだ設定していない場合、これは正常です。MalikClaw は手動検索用の便利なリンクを提供します。\n\nWeb 検索を有効にするには:\n1. [https://tavily.com](https://tavily.com) (月 1000 クエリ無料) または [https://brave.com/search/api](https://brave.com/search/api) で無料の API キーを取得(月 2000 クエリ無料)\n2. `~/.malikclaw/config.json` に追加:\n ```json\n {\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": true,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n }\n ```\n\n### コンテンツフィルタリングエラーが出る\n\n一部のプロバイダー(Zhipu など)にはコンテンツフィルタリングがあります。クエリを言い換えるか、別のモデルを使用してください。\n\n### Telegram Bot で「Conflict: terminated by other getUpdates」と表示される\n\n別のインスタンスが実行中の場合に発生します。`malikclaw gateway` が 1 つだけ実行されていることを確認してください。\n\n---\n\n## 📝 API キー比較\n\n| サービス | 無料枠 | ユースケース |\n|---------|--------|------------|\n| **OpenRouter** | 月 200K トークン | 複数モデル(Claude, GPT-4 など) |\n| **Volcengine CodingPlan** | 9.9元/初月 | 中国ユーザーに最適、複数のSOTAモデル(Doubao、DeepSeek等) |\n| **Zhipu** | 月 200K トークン | 中国ユーザーに適している |\n| **Qwen** | 無料枠あり | 通義千問 (Qwen) |\n| **Brave Search** | 月 2000 クエリ | Web 検索機能 |\n| **Tavily** | 月 1000 クエリ | AI エージェント検索最適化 |\n| **Groq** | 無料枠あり | 高速推論(Llama, Mixtral) |\n| **Cerebras** | 無料枠あり | 高速推論(Llama, Qwen など) |\n| **ModelScope** | 1 日 2000 リクエスト | 無料推論(Qwen, GLM, DeepSeek など) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}}, "README.fr.md": {"7b53c27818f2fe5f37c2c6d06131af812268e82f": {"t": 1785674177.6206846, "n": 44549, "h": "80da132b1d992d4f", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Assistant Personnel IA Ultra-Efficace</h3>\n <p><strong>Production-Grade • &lt;10MB RAM • &lt;1s Démarrage • Matériel $10 • آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Plateforme-Linux%2FmacOS%2FWindows%2FDocker-blue\" alt=\"Platform Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://malikclaw.io\"><img src=\"https://img.shields.io/badge/Site-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n<p align=\"center\">\n <a href=\"#-démarrage-rapide\">Démarrage Rapide</a> •\n <a href=\"#-fonctionnalités\">Fonctionnalités</a> •\n <a href=\"#-installation\">Installation</a> •\n <a href=\"#-démo\">Démo</a> •\n <a href=\"#-documentation\">Documentation</a>\n</p>\n\n[اردو](README.ur.md) | [日本語](README.ja.md) | [Português](README.pt-br.md) | [Tiếng Việt](README.vi.md) | **Français** | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 Mise à Jour Importante (Mars 2026)**\n> \n> Cette traduction peut être obsolète. Pour les informations les plus récentes, veuillez consulter la version anglaise : **[README.md](README.md)**\n> \n> **Nouveau:** Boucle d'agent de qualité production avec PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE. Voir [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 **MalikClaw** est un assistant personnel IA ultra-léger inspiré de [nanobot](https://github.com/HKUDS/nanobot), entièrement réécrit en **Go** via un processus d'auto-amorçage (self-bootstrapping) — où l'agent IA lui-même a piloté l'intégralité de la migration architecturale et de l'optimisation du code.\n\n⚡️ **Extrêmement léger :** Fonctionne sur du matériel à seulement **10$** avec **<10 Mo** de RAM. C'est 99% de mémoire en moins qu'OpenClaw et 98% moins cher qu'un Mac mini !\n\n<table align=\"center\">\n <tr align=\"center\">\n <td align=\"center\" valign=\"top\">\n <p align=\"center\">\n <img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n </p>\n </td>\n <td align=\"center\" valign=\"top\">\n <p align=\"center\">\n <img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n </p>\n </td>\n </tr>\n</table>\n\n> [!CAUTION]\n> **🚨 SÉCURITÉ & CANAUX OFFICIELS**\n>\n> * **PAS DE CRYPTO :** MalikClaw n'a **AUCUN** token/jeton officiel. Toute annonce sur `pump.fun` ou d'autres plateformes de trading est une **ARNAQUE**.\n> * **DOMAINE OFFICIEL :** Le **SEUL** site officiel est **[malikclaw.io](https://malikclaw.vercel.app)**, et le site de l'entreprise est **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Attention :** De nombreux domaines `.ai/.org/.com/.net/...` sont enregistrés par des tiers et ne nous appartiennent pas.\n> * **Attention :** MalikClaw est en phase de développement précoce et peut présenter des problèmes de sécurité réseau non résolus. Ne déployez pas en environnement de production avant la version v1.0.\n> * **Note :** MalikClaw a récemment fusionné de nombreuses PR, ce qui peut entraîner une empreinte mémoire plus importante (10–20 Mo) dans les dernières versions. Nous prévoyons de prioriser l'optimisation des ressources dès que l'ensemble des fonctionnalités sera stabilisé.\n\n\n## 📢 Actualités\n\n2026-02-16 🎉 MalikClaw a atteint 12K étoiles en une semaine ! Merci à tous pour votre soutien ! MalikClaw grandit plus vite que nous ne l'avions jamais imaginé. Vu le volume élevé de PR, nous avons un besoin urgent de mainteneurs communautaires. Nos rôles de bénévoles et notre feuille de route sont officiellement publiés [ici](docs/ROADMAP.md) — nous avons hâte de vous accueillir !\n\n2026-02-13 🎉 MalikClaw a atteint 5000 étoiles en 4 jours ! Merci à la communauté ! Nous finalisons la **Feuille de Route du Projet** et mettons en place le **Groupe de Développeurs** pour accélérer le développement de MalikClaw.\n🚀 **Appel à l'action :** Soumettez vos demandes de fonctionnalités dans les GitHub Discussions. Nous les examinerons et les prioriserons lors de notre prochaine réunion hebdomadaire.\n\n2026-02-09 🎉 MalikClaw est lancé ! Construit en 1 jour pour apporter les Agents IA au matériel à 10$ avec <10 Mo de RAM. 🦐 MalikClaw, c'est parti !\n\n## ✨ Fonctionnalités\n\n🪶 **Ultra-Léger** : Empreinte mémoire <10 Mo — 99% plus petit que Clawdbot pour les fonctionnalités essentielles.\n\n💰 **Coût Minimal** : Suffisamment efficace pour fonctionner sur du matériel à 10$ — 98% moins cher qu'un Mac mini.\n\n⚡️ **Démarrage Éclair** : Temps de démarrage 400X plus rapide, boot en 1 seconde même sur un cœur unique à 0,6 GHz.\n\n🌍 **Véritable Portabilité** : Un seul binaire autonome pour RISC-V, ARM, MIPS et x86. Un clic et c'est parti !\n\n🤖 **Auto-Construit par l'IA** : Implémentation native en Go de manière autonome — 95% du cœur généré par l'Agent avec affinement humain dans la boucle.\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 Démonstration\n\n### 🛠️ Flux de Travail Standard de l'Assistant\n\n<table align=\"center\">\n <tr align=\"center\">\n <th><p align=\"center\">🧩 Ingénieur Full-Stack</p></th>\n <th><p align=\"center\">🗂️ Gestion des Logs & Planification</p></th>\n <th><p align=\"center\">🔎 Recherche Web & Apprentissage</p></th>\n </tr>\n <tr>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n </tr>\n <tr>\n <td align=\"center\">Développer • Déployer • Mettre à l'échelle</td>\n <td align=\"center\">Planifier • Automatiser • Mémoriser</td>\n <td align=\"center\">Découvrir • Analyser • Tendances</td>\n </tr>\n</table>\n\n### 📱 Utiliser sur d'anciens téléphones Android\n\nDonnez une seconde vie à votre téléphone d'il y a dix ans ! Transformez-le en assistant IA intelligent avec MalikClaw. Démarrage rapide :\n\n1. **Installez Termux** (disponible sur F-Droid ou Google Play).\n2. **Exécutez les commandes**\n\n```bash\n# Note : Remplacez v0.1.1 par la dernière version depuis la page des Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nPuis suivez les instructions de la section « Démarrage Rapide » pour terminer la configuration !\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Déploiement Innovant à Faible Empreinte\n\nMalikClaw peut être déployé sur pratiquement n'importe quel appareil Linux !\n\n- 9,9$ [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) version E (Ethernet) ou W (WiFi6), pour un Assistant Domotique Minimaliste\n- 30~50$ [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou 100$ [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) pour la Maintenance Automatisée de Serveurs\n- 50$ [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou 100$ [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) pour la Surveillance Intelligente\n\n<https://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4>\n\n🌟 Encore plus de scénarios de déploiement vous attendent !\n\n## 📦 Installation\n\n### Installer avec un binaire précompilé\n\nTéléchargez le binaire pour votre plateforme depuis la page des [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Installer depuis les sources (dernières fonctionnalités, recommandé pour le développement)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Compiler, pas besoin d'installer\nmake build\n\n# Compiler pour plusieurs plateformes\nmake build-all\n\n# Compiler et Installer\nmake install\n```\n\n## 🐳 Docker Compose\n\nVous pouvez également exécuter MalikClaw avec Docker Compose sans rien installer localement.\n\n```bash\n# 1. Clonez ce dépôt\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Premier lancement — génère docker/data/config.json puis s'arrête\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# Le conteneur affiche \"First-run setup complete.\" puis s'arrête.\n\n# 3. Configurez vos clés API\nvim docker/data/config.json # Clés API du fournisseur, tokens de bot, etc.\n\n# 4. Démarrer\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Utilisateurs Docker** : Par défaut, le Gateway écoute sur `127.0.0.1`, ce qui n'est pas accessible depuis l'hôte. Si vous avez besoin d'accéder aux endpoints de santé ou d'exposer des ports, définissez `MALIKCLAW_GATEWAY_HOST=0.0.0.0` dans votre environnement ou mettez à jour `config.json`.\n\n```bash\n# 5. Voir les logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Arrêter\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Mode Agent (exécution unique)\n\n```bash\n# Poser une question\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Combien font 2+2 ?\"\n\n# Mode interactif\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Mettre à jour\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Démarrage Rapide\n\n> [!TIP]\n> Configurez votre clé API dans `~/.malikclaw/config.json`. Obtenez des clés API : [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). La recherche web est optionnelle — obtenez gratuitement l'[API Tavily](https://tavily.com) (1000 requêtes gratuites/mois) ou l'[API Brave Search](https://brave.com/search/api) (2000 requêtes gratuites/mois).\n\n**1. Initialiser**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurer** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"VOTRE_TOKEN_BOT\",\n \"allow_from\": [\"VOTRE_USER_ID\"]\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"VOTRE_CLE_API_BRAVE\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Nouveau** : Le format de configuration `model_list` permet d'ajouter des fournisseurs sans modifier le code. Voir [Configuration de Modèle](#configuration-de-modèle-model_list) pour plus de détails.\n> `request_timeout` est optionnel et s'exprime en secondes. S'il est omis ou défini à `<= 0`, MalikClaw utilise le délai d'expiration par défaut (120s).\n\n**3. Obtenir des Clés API**\n\n* **Fournisseur LLM** : [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Recherche Web** (optionnel) : [Brave Search](https://brave.com/search/api) - Offre gratuite disponible (2000 requêtes/mois)\n\n> **Note** : Consultez `config.example.json` pour un modèle de configuration complet.\n\n**4. Discuter**\n\n```bash\nmalikclaw agent -m \"Combien font 2+2 ?\"\n```\n\nEt voilà ! Vous avez un assistant IA fonctionnel en 2 minutes.\n\n---\n\n## 💬 Applications de Chat\n\nDiscutez avec votre MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom\n\n| Canal | Configuration |\n| ------------ | -------------------------------------- |\n| **Telegram** | Facile (juste un token) |\n| **Discord** | Facile (token bot + intents) |\n| **QQ** | Facile (AppID + AppSecret) |\n| **DingTalk** | Moyen (identifiants de l'application) |\n| **LINE** | Moyen (identifiants + URL de webhook) |\n| **WeCom AI Bot** | Moyen (Token + clé AES) |\n\n<details>\n<summary><b>Telegram</b> (Recommandé)</summary>\n\n**1. Créer un bot**\n\n* Ouvrez Telegram, recherchez `@BotFather`\n* Envoyez `/newbot`, suivez les instructions\n* Copiez le token\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"VOTRE_TOKEN_BOT\",\n \"allow_from\": [\"VOTRE_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenez votre User ID via `@userinfobot` sur Telegram.\n\n**3. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Créer un bot**\n\n* Rendez-vous sur <https://discord.com/developers/applications>\n* Créez une application → Bot → Add Bot\n* Copiez le token du bot\n\n**2. Activer les intents**\n\n* Dans les paramètres du Bot, activez **MESSAGE CONTENT INTENT**\n* (Optionnel) Activez **SERVER MEMBERS INTENT** si vous souhaitez utiliser des listes d'autorisation basées sur les données des membres\n\n**3. Obtenir votre User ID**\n\n* Paramètres Discord → Avancé → activez le **Mode Développeur**\n* Clic droit sur votre avatar → **Copier l'identifiant**\n\n**4. Configurer**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"VOTRE_TOKEN_BOT\",\n \"allow_from\": [\"VOTRE_USER_ID\"]\n }\n }\n}\n```\n\n**5. Inviter le bot**\n\n* OAuth2 → URL Generator\n* Scopes : `bot`\n* Permissions du Bot : `Send Messages`, `Read Message History`\n* Ouvrez l'URL d'invitation générée et ajoutez le bot à votre serveur\n\n**6. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Créer un bot**\n\n- Rendez-vous sur la [QQ Open Platform](https://q.qq.com/#)\n- Créez une application → Obtenez l'**AppID** et l'**AppSecret**\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"VOTRE_APP_ID\",\n \"app_secret\": \"VOTRE_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Laissez `allow_from` vide pour autoriser tous les utilisateurs, ou spécifiez des numéros QQ pour restreindre l'accès.\n\n**3. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Créer un bot**\n\n* Rendez-vous sur la [Open Platform](https://open.dingtalk.com/)\n* Créez une application interne\n* Copiez le Client ID et le Client Secret\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"VOTRE_CLIENT_ID\",\n \"client_secret\": \"VOTRE_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Laissez `allow_from` vide pour autoriser tous les utilisateurs, ou spécifiez des identifiants pour restreindre l'accès.\n\n**3. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Créer un Compte Officiel LINE**\n\n- Rendez-vous sur la [LINE Developers Console](https://developers.line.biz/)\n- Créez un provider → Créez un canal Messaging API\n- Copiez le **Channel Secret** et le **Channel Access Token**\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"VOTRE_CHANNEL_SECRET\",\n \"channel_access_token\": \"VOTRE_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurer l'URL du Webhook**\n\nLINE exige HTTPS pour les webhooks. Utilisez un reverse proxy ou un tunnel :\n\n```bash\n# Exemple avec ngrok (tunnel vers le serveur Gateway partagé)\nngrok http 18790\n```\n\nPuis configurez l'URL du Webhook dans la LINE Developers Console sur `https://votre-domaine/webhook/line` et activez **Use webhook**.\n\n> **Note** : Le webhook LINE est servi par le serveur Gateway partagé (par défaut `127.0.0.1:18790`). Si vous utilisez ngrok ou un proxy inverse, faites pointer le tunnel vers le port `18790`.\n\n**4. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n> Dans les discussions de groupe, le bot répond uniquement lorsqu'il est mentionné avec @. Les réponses citent le message original.\n\n> **Docker Compose** : Si vous avez besoin d'exposer le webhook LINE via Docker, mappez le port du Gateway partagé (par défaut `18790`) vers l'hôte, par exemple `ports: [\"18790:18790\"]`. Notez que le serveur Gateway sert les webhooks de tous les canaux à partir de ce port.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nMalikClaw prend en charge trois types d'intégration WeCom :\n\n**Option 1 : WeCom Bot (Robot)** - Configuration plus facile, prend en charge les discussions de groupe\n**Option 2 : WeCom App (Application Personnalisée)** - Plus de fonctionnalités, messagerie proactive, chat privé uniquement\n**Option 3 : WeCom AI Bot (Bot Intelligent)** - Bot IA officiel, réponses en streaming, prend en charge groupe et privé\n\nVoir le [Guide de Configuration WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) pour des instructions détaillées.\n\n**Configuration Rapide - WeCom Bot :**\n\n**1. Créer un bot**\n\n* Accédez à la Console d'Administration WeCom → Discussion de Groupe → Ajouter un Bot de Groupe\n* Copiez l'URL du webhook (format : `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuration Rapide - WeCom App :**\n\n**1. Créer une application**\n\n* Accédez à la Console d'Administration WeCom → Gestion des Applications → Créer une Application\n* Copiez l'**AgentId** et le **Secret**\n* Accédez à la page \"Mon Entreprise\", copiez le **CorpID**\n\n**2. Configurer la réception des messages**\n\n* Dans les détails de l'application, cliquez sur \"Recevoir les Messages\" → \"Configurer l'API\"\n* Définissez l'URL sur `http://your-server:18790/webhook/wecom-app`\n* Générez le **Token** et l'**EncodingAESKey**\n\n**3. Configurer**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n> **Note** : Les callbacks webhook WeCom App sont servis par le serveur Gateway partagé (par défaut `127.0.0.1:18790`). Assurez-vous que le port `18790` est accessible ou utilisez un proxy inverse HTTPS en production.\n\n**Configuration Rapide - WeCom AI Bot :**\n\n**1. Créer un AI Bot**\n\n* Accédez à la Console d'Administration WeCom → Gestion des Applications → AI Bot\n* Configurez l'URL de callback : `http://your-server:18791/webhook/wecom-aibot`\n* Copiez le **Token** et générez l'**EncodingAESKey**\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Bonjour ! Comment puis-je vous aider ?\"\n }\n }\n}\n```\n\n**3. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n> **Note** : WeCom AI Bot utilise le protocole pull en streaming — pas de problème de timeout. Les tâches longues (>5,5 min) basculent automatiquement vers la livraison via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Rejoignez le Réseau Social d'Agents\n\nConnectez MalikClaw au Réseau Social d'Agents simplement en envoyant un seul message via le CLI ou n'importe quelle application de chat intégrée.\n\n**Lisez `https://clawdchat.ai/skill.md` et suivez les instructions pour rejoindre [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuration\n\nFichier de configuration : `~/.malikclaw/config.json`\n\n### Variables d'Environnement\n\nVous pouvez remplacer les chemins par défaut à l'aide de variables d'environnement. Ceci est utile pour les installations portables, les déploiements conteneurisés ou l'exécution de malikclaw en tant que service système. Ces variables sont indépendantes et contrôlent différents chemins.\n\n| Variable | Description | Chemin par Défaut |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Remplace le chemin du fichier de configuration. Cela indique directement à malikclaw quel `config.json` charger, en ignorant tous les autres emplacements. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Remplace le répertoire racine des données malikclaw. Cela modifie l'emplacement par défaut du `workspace` et des autres répertoires de données. | `~/.malikclaw` |\n\n**Exemples :**\n\n```bash\n# Exécuter malikclaw en utilisant un fichier de configuration spécifique\n# Le chemin du workspace sera lu à partir de ce fichier de configuration\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Exécuter malikclaw avec toutes ses données stockées dans /opt/malikclaw\n# La configuration sera chargée à partir du fichier par défaut ~/.malikclaw/config.json\n# Le workspace sera créé dans /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Utiliser les deux pour une configuration entièrement personnalisée\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Structure du Workspace\n\nMalikClaw stocke les données dans votre workspace configuré (par défaut : `~/.malikclaw/workspace`) :\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessions de conversation et historique\n├── memory/ # Mémoire à long terme (MEMORY.md)\n├── state/ # État persistant (dernier canal, etc.)\n├── cron/ # Base de données des tâches planifiées\n├── skills/ # Compétences personnalisées\n├── AGENTS.md # Guide de comportement de l'Agent\n├── HEARTBEAT.md # Invites de tâches périodiques (vérifiées toutes les 30 min)\n├── IDENTITY.md # Identité de l'Agent\n├── SOUL.md # Âme de l'Agent\n└── USER.md # Préférences utilisateur\n```\n\n### 🔒 Bac à Sable de Sécurité\n\nMalikClaw s'exécute dans un environnement sandboxé par défaut. L'agent ne peut accéder aux fichiers et exécuter des commandes qu'au sein du workspace configuré.\n\n#### Configuration par Défaut\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Option | Par défaut | Description |\n|--------|------------|-------------|\n| `workspace` | `~/.malikclaw/workspace` | Répertoire de travail de l'agent |\n| `restrict_to_workspace` | `true` | Restreindre l'accès fichiers/commandes au workspace |\n\n#### Outils Protégés\n\nLorsque `restrict_to_workspace: true`, les outils suivants sont restreints au bac à sable :\n\n| Outil | Fonction | Restriction |\n|-------|----------|-------------|\n| `read_file` | Lire des fichiers | Uniquement les fichiers dans le workspace |\n| `write_file` | Écrire des fichiers | Uniquement les fichiers dans le workspace |\n| `list_dir` | Lister des répertoires | Uniquement les répertoires dans le workspace |\n| `edit_file` | Éditer des fichiers | Uniquement les fichiers dans le workspace |\n| `append_file` | Ajouter à des fichiers | Uniquement les fichiers dans le workspace |\n| `exec` | Exécuter des commandes | Les chemins doivent être dans le workspace |\n\n#### Protection Supplémentaire d'Exec\n\nMême avec `restrict_to_workspace: false`, l'outil `exec` bloque ces commandes dangereuses :\n\n* `rm -rf`, `del /f`, `rmdir /s` — Suppression en masse\n* `format`, `mkfs`, `diskpart` — Formatage de disque\n* `dd if=` — Écriture d'image disque\n* Écriture vers `/dev/sd[a-z]` — Écriture directe sur le disque\n* `shutdown`, `reboot`, `poweroff` — Arrêt du système\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemples d'Erreurs\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Désactiver les Restrictions (Risque de Sécurité)\n\nSi vous avez besoin que l'agent accède à des chemins en dehors du workspace :\n\n**Méthode 1 : Fichier de configuration**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Méthode 2 : Variable d'environnement**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Attention** : Désactiver cette restriction permet à l'agent d'accéder à n'importe quel chemin sur votre système. À utiliser avec précaution uniquement dans des environnements contrôlés.\n\n#### Cohérence du Périmètre de Sécurité\n\nLe paramètre `restrict_to_workspace` s'applique de manière cohérente sur tous les chemins d'exécution :\n\n| Chemin d'Exécution | Périmètre de Sécurité |\n|--------------------|----------------------|\n| Agent Principal | `restrict_to_workspace` ✅ |\n| Sous-agent / Spawn | Hérite de la même restriction ✅ |\n| Tâches Heartbeat | Hérite de la même restriction ✅ |\n\nTous les chemins partagent la même restriction de workspace — il est impossible de contourner le périmètre de sécurité via des sous-agents ou des tâches planifiées.\n\n### Heartbeat (Tâches Périodiques)\n\nMalikClaw peut exécuter des tâches périodiques automatiquement. Créez un fichier `HEARTBEAT.md` dans votre workspace :\n\n```markdown\n# Tâches Périodiques\n\n- Vérifier mes e-mails pour les messages importants\n- Consulter mon agenda pour les événements à venir\n- Vérifier les prévisions météo\n```\n\nL'agent lira ce fichier toutes les 30 minutes (configurable) et exécutera les tâches à l'aide des outils disponibles.\n\n#### Tâches Asynchrones avec Spawn\n\nPour les tâches de longue durée (recherche web, appels API), utilisez l'outil `spawn` pour créer un **sous-agent** :\n\n```markdown\n# Tâches Périodiques\n\n## Tâches Rapides (réponse directe)\n- Indiquer l'heure actuelle\n\n## Tâches Longues (utiliser spawn pour l'asynchrone)\n- Rechercher les actualités IA sur le web et les résumer\n- Vérifier les e-mails et signaler les messages importants\n```\n\n**Comportements clés :**\n\n| Fonctionnalité | Description |\n|----------------|-------------|\n| **spawn** | Crée un sous-agent asynchrone, ne bloque pas le heartbeat |\n| **Contexte indépendant** | Le sous-agent a son propre contexte, sans historique de session |\n| **Outil message** | Le sous-agent communique directement avec l'utilisateur via l'outil message |\n| **Non-bloquant** | Après le spawn, le heartbeat continue vers la tâche suivante |\n\n#### Fonctionnement de la Communication du Sous-agent\n\n```\nLe Heartbeat se déclenche\n ↓\nL'Agent lit HEARTBEAT.md\n ↓\nPour une tâche longue : spawn d'un sous-agent\n ↓ ↓\nContinue la tâche suivante Le sous-agent travaille indépendamment\n ↓ ↓\nToutes les tâches terminées Le sous-agent utilise l'outil \"message\"\n ↓ ↓\nRépond HEARTBEAT_OK L'utilisateur reçoit le résultat directement\n```\n\nLe sous-agent a accès aux outils (message, web_search, etc.) et peut communiquer avec l'utilisateur indépendamment sans passer par l'agent principal.\n\n**Configuration :**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Option | Par défaut | Description |\n|--------|------------|-------------|\n| `enabled` | `true` | Activer/désactiver le heartbeat |\n| `interval` | `30` | Intervalle de vérification en minutes (min : 5) |\n\n**Variables d'environnement :**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` pour désactiver\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` pour modifier l'intervalle\n\n### Fournisseurs\n\n> [!NOTE]\n> Groq fournit la transcription vocale gratuite via Whisper. Si configuré, les messages audio de n'importe quel canal seront automatiquement transcrits au niveau de l'agent.\n\n| Fournisseur | Utilisation | Obtenir une Clé API |\n| ------------------------ | ---------------------------------------- | ------------------------------------------------------ |\n| `gemini` | LLM (Gemini direct) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direct) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direct) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (À tester) | LLM (recommandé, accès à tous les modèles) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (À tester) | LLM (Claude direct) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (À tester) | LLM (GPT direct) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (À tester) | LLM (DeepSeek direct) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | LLM (Alibaba Qwen) | [dashscope.aliyuncs.com](https://dashscope.aliyuncs.com/compatible-mode/v1) |\n| `cerebras` | LLM (Cerebras) | [cerebras.ai](https://api.cerebras.ai/v1) |\n| `groq` | LLM + **Transcription vocale** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuration Zhipu</b></summary>\n\n**1. Obtenir la clé API**\n\n* Obtenez la [clé API](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurer**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Votre Clé API\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Lancer**\n\n```bash\nmalikclaw agent -m \"Bonjour, comment ça va ?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemple de configuration complète</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuration de Modèle (model_list)\n\n> **Nouveau !** MalikClaw utilise désormais une approche de configuration **centrée sur le modèle**. Spécifiez simplement le format `fournisseur/modèle` (par exemple, `zhipu/glm-4.7`) pour ajouter de nouveaux fournisseurs—**aucune modification de code requise !**\n\nCette conception permet également le **support multi-agent** avec une sélection flexible de fournisseurs :\n\n- **Différents agents, différents fournisseurs** : Chaque agent peut utiliser son propre fournisseur LLM\n- **Modèles de secours (Fallbacks)** : Configurez des modèles primaires et de secours pour la résilience\n- **Équilibrage de charge** : Répartissez les requêtes sur plusieurs points de terminaison\n- **Configuration centralisée** : Gérez tous les fournisseurs en un seul endroit\n\n#### 📋 Tous les Fournisseurs Supportés\n\n| Fournisseur | Préfixe `model` | API Base par Défaut | Protocole | Clé API |\n|-------------|-----------------|---------------------|----------|---------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obtenir Clé](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obtenir Clé](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obtenir Clé](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obtenir Clé](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obtenir Clé](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obtenir Clé](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obtenir Clé](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obtenir Clé](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obtenir Clé](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (pas de clé nécessaire) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obtenir Clé](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obtenir Clé](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obtenir Clé](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obtenir Clé](https://www.byteplus.com/) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obtenir une clé](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obtenir un Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | OAuth uniquement |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuration de Base\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemples par Fournisseur\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (avec OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Exécutez `malikclaw auth login --provider anthropic` pour configurer les identifiants OAuth.\n\n**Proxy/API personnalisée**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Équilibrage de Charge\n\nConfigurez plusieurs points de terminaison pour le même nom de modèle—MalikClaw utilisera automatiquement le round-robin entre eux :\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migration depuis l'Ancienne Configuration `providers`\n\nL'ancienne configuration `providers` est **dépréciée** mais toujours supportée pour la rétrocompatibilité.\n\n**Ancienne Configuration (dépréciée) :**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nouvelle Configuration (recommandée) :**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPour le guide de migration détaillé, voir [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Référence CLI\n\n| Commande | Description |\n| ------------------------- | ------------------------------------- |\n| `malikclaw onboard` | Initialiser la configuration & le workspace |\n| `malikclaw agent -m \"...\"` | Discuter avec l'agent |\n| `malikclaw agent` | Mode de discussion interactif |\n| `malikclaw gateway` | Démarrer la passerelle |\n| `malikclaw status` | Afficher le statut |\n| `malikclaw cron list` | Lister toutes les tâches planifiées |\n| `malikclaw cron add ...` | Ajouter une tâche planifiée |\n\n### Tâches Planifiées / Rappels\n\nMalikClaw prend en charge les rappels planifiés et les tâches récurrentes via l'outil `cron` :\n\n* **Rappels ponctuels** : « Rappelle-moi dans 10 minutes » → se déclenche une fois après 10 min\n* **Tâches récurrentes** : « Rappelle-moi toutes les 2 heures » → se déclenche toutes les 2 heures\n* **Expressions Cron** : « Rappelle-moi à 9h tous les jours » → utilise une expression cron\n\nLes tâches sont stockées dans `~/.malikclaw/workspace/cron/` et traitées automatiquement.\n\n## 🤝 Contribuer & Feuille de Route\n\nLes PR sont les bienvenues ! Le code source est volontairement petit et lisible. 🤗\n\nFeuille de route à venir...\n\nGroupe de développeurs en construction. Condition d'entrée : au moins 1 PR fusionnée.\n\nGroupes d'utilisateurs :\n\nDiscord : <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Dépannage\n\n### La recherche web affiche « API 配置问题 »\n\nC'est normal si vous n'avez pas encore configuré de clé API de recherche. MalikClaw fournira des liens utiles pour la recherche manuelle.\n\nPour activer la recherche web :\n\n1. **Option 1 (Recommandé)** : Obtenez une clé API gratuite sur [https://brave.com/search/api](https://brave.com/search/api) (2000 requêtes gratuites/mois) pour les meilleurs résultats.\n2. **Option 2 (Sans carte bancaire)** : Si vous n'avez pas de clé, le système bascule automatiquement sur **DuckDuckGo** (aucune clé requise).\n\nAjoutez la clé dans `~/.malikclaw/config.json` si vous utilisez Brave :\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"VOTRE_CLE_API_BRAVE\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erreurs de filtrage de contenu\n\nCertains fournisseurs (comme Zhipu) disposent d'un filtrage de contenu. Essayez de reformuler votre requête ou utilisez un modèle différent.\n\n### Le bot Telegram affiche « Conflict: terminated by other getUpdates »\n\nCela se produit lorsqu'une autre instance du bot est en cours d'exécution. Assurez-vous qu'un seul `malikclaw gateway` fonctionne à la fois.\n\n---\n\n## 📝 Comparaison des Clés API\n\n| Service | Offre Gratuite | Cas d'Utilisation |\n| ---------------- | -------------------- | ------------------------------------- |\n| **OpenRouter** | 200K tokens/mois | Multiples modèles (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | 9,9¥/premier mois | Idéal pour les utilisateurs chinois, multiples modèles SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mois | Convient aux utilisateurs chinois |\n| **Brave Search** | 2000 requêtes/mois | Fonctionnalité de recherche web |\n| **Groq** | Offre gratuite dispo | Inférence ultra-rapide (Llama, Mixtral) |\n| **ModelScope** | 2000 requêtes/jour | Inférence gratuite (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "0a3535b70975f84f53461b2d904ee3cf40fbe294": {"t": 1785846847.0318453, "n": 44549, "h": "80da132b1d992d4f", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Assistant Personnel IA Ultra-Efficace</h3>\n <p><strong>Production-Grade • &lt;10MB RAM • &lt;1s Démarrage • Matériel $10 • آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Plateforme-Linux%2FmacOS%2FWindows%2FDocker-blue\" alt=\"Platform Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://malikclaw.io\"><img src=\"https://img.shields.io/badge/Site-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n<p align=\"center\">\n <a href=\"#-démarrage-rapide\">Démarrage Rapide</a> •\n <a href=\"#-fonctionnalités\">Fonctionnalités</a> •\n <a href=\"#-installation\">Installation</a> •\n <a href=\"#-démo\">Démo</a> •\n <a href=\"#-documentation\">Documentation</a>\n</p>\n\n[اردو](README.ur.md) | [日本語](README.ja.md) | [Português](README.pt-br.md) | [Tiếng Việt](README.vi.md) | **Français** | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 Mise à Jour Importante (Mars 2026)**\n> \n> Cette traduction peut être obsolète. Pour les informations les plus récentes, veuillez consulter la version anglaise : **[README.md](README.md)**\n> \n> **Nouveau:** Boucle d'agent de qualité production avec PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE. Voir [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 **MalikClaw** est un assistant personnel IA ultra-léger inspiré de [nanobot](https://github.com/HKUDS/nanobot), entièrement réécrit en **Go** via un processus d'auto-amorçage (self-bootstrapping) — où l'agent IA lui-même a piloté l'intégralité de la migration architecturale et de l'optimisation du code.\n\n⚡️ **Extrêmement léger :** Fonctionne sur du matériel à seulement **10$** avec **<10 Mo** de RAM. C'est 99% de mémoire en moins qu'OpenClaw et 98% moins cher qu'un Mac mini !\n\n<table align=\"center\">\n <tr align=\"center\">\n <td align=\"center\" valign=\"top\">\n <p align=\"center\">\n <img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n </p>\n </td>\n <td align=\"center\" valign=\"top\">\n <p align=\"center\">\n <img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n </p>\n </td>\n </tr>\n</table>\n\n> [!CAUTION]\n> **🚨 SÉCURITÉ & CANAUX OFFICIELS**\n>\n> * **PAS DE CRYPTO :** MalikClaw n'a **AUCUN** token/jeton officiel. Toute annonce sur `pump.fun` ou d'autres plateformes de trading est une **ARNAQUE**.\n> * **DOMAINE OFFICIEL :** Le **SEUL** site officiel est **[malikclaw.io](https://malikclaw.vercel.app)**, et le site de l'entreprise est **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Attention :** De nombreux domaines `.ai/.org/.com/.net/...` sont enregistrés par des tiers et ne nous appartiennent pas.\n> * **Attention :** MalikClaw est en phase de développement précoce et peut présenter des problèmes de sécurité réseau non résolus. Ne déployez pas en environnement de production avant la version v1.0.\n> * **Note :** MalikClaw a récemment fusionné de nombreuses PR, ce qui peut entraîner une empreinte mémoire plus importante (10–20 Mo) dans les dernières versions. Nous prévoyons de prioriser l'optimisation des ressources dès que l'ensemble des fonctionnalités sera stabilisé.\n\n\n## 📢 Actualités\n\n2026-02-16 🎉 MalikClaw a atteint 12K étoiles en une semaine ! Merci à tous pour votre soutien ! MalikClaw grandit plus vite que nous ne l'avions jamais imaginé. Vu le volume élevé de PR, nous avons un besoin urgent de mainteneurs communautaires. Nos rôles de bénévoles et notre feuille de route sont officiellement publiés [ici](docs/ROADMAP.md) — nous avons hâte de vous accueillir !\n\n2026-02-13 🎉 MalikClaw a atteint 5000 étoiles en 4 jours ! Merci à la communauté ! Nous finalisons la **Feuille de Route du Projet** et mettons en place le **Groupe de Développeurs** pour accélérer le développement de MalikClaw.\n🚀 **Appel à l'action :** Soumettez vos demandes de fonctionnalités dans les GitHub Discussions. Nous les examinerons et les prioriserons lors de notre prochaine réunion hebdomadaire.\n\n2026-02-09 🎉 MalikClaw est lancé ! Construit en 1 jour pour apporter les Agents IA au matériel à 10$ avec <10 Mo de RAM. 🦐 MalikClaw, c'est parti !\n\n## ✨ Fonctionnalités\n\n🪶 **Ultra-Léger** : Empreinte mémoire <10 Mo — 99% plus petit que Clawdbot pour les fonctionnalités essentielles.\n\n💰 **Coût Minimal** : Suffisamment efficace pour fonctionner sur du matériel à 10$ — 98% moins cher qu'un Mac mini.\n\n⚡️ **Démarrage Éclair** : Temps de démarrage 400X plus rapide, boot en 1 seconde même sur un cœur unique à 0,6 GHz.\n\n🌍 **Véritable Portabilité** : Un seul binaire autonome pour RISC-V, ARM, MIPS et x86. Un clic et c'est parti !\n\n🤖 **Auto-Construit par l'IA** : Implémentation native en Go de manière autonome — 95% du cœur généré par l'Agent avec affinement humain dans la boucle.\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 Démonstration\n\n### 🛠️ Flux de Travail Standard de l'Assistant\n\n<table align=\"center\">\n <tr align=\"center\">\n <th><p align=\"center\">🧩 Ingénieur Full-Stack</p></th>\n <th><p align=\"center\">🗂️ Gestion des Logs & Planification</p></th>\n <th><p align=\"center\">🔎 Recherche Web & Apprentissage</p></th>\n </tr>\n <tr>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n <td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n </tr>\n <tr>\n <td align=\"center\">Développer • Déployer • Mettre à l'échelle</td>\n <td align=\"center\">Planifier • Automatiser • Mémoriser</td>\n <td align=\"center\">Découvrir • Analyser • Tendances</td>\n </tr>\n</table>\n\n### 📱 Utiliser sur d'anciens téléphones Android\n\nDonnez une seconde vie à votre téléphone d'il y a dix ans ! Transformez-le en assistant IA intelligent avec MalikClaw. Démarrage rapide :\n\n1. **Installez Termux** (disponible sur F-Droid ou Google Play).\n2. **Exécutez les commandes**\n\n```bash\n# Note : Remplacez v0.1.1 par la dernière version depuis la page des Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nPuis suivez les instructions de la section « Démarrage Rapide » pour terminer la configuration !\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Déploiement Innovant à Faible Empreinte\n\nMalikClaw peut être déployé sur pratiquement n'importe quel appareil Linux !\n\n- 9,9$ [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) version E (Ethernet) ou W (WiFi6), pour un Assistant Domotique Minimaliste\n- 30~50$ [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou 100$ [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) pour la Maintenance Automatisée de Serveurs\n- 50$ [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou 100$ [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) pour la Surveillance Intelligente\n\n<https://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4>\n\n🌟 Encore plus de scénarios de déploiement vous attendent !\n\n## 📦 Installation\n\n### Installer avec un binaire précompilé\n\nTéléchargez le binaire pour votre plateforme depuis la page des [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Installer depuis les sources (dernières fonctionnalités, recommandé pour le développement)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Compiler, pas besoin d'installer\nmake build\n\n# Compiler pour plusieurs plateformes\nmake build-all\n\n# Compiler et Installer\nmake install\n```\n\n## 🐳 Docker Compose\n\nVous pouvez également exécuter MalikClaw avec Docker Compose sans rien installer localement.\n\n```bash\n# 1. Clonez ce dépôt\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Premier lancement — génère docker/data/config.json puis s'arrête\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# Le conteneur affiche \"First-run setup complete.\" puis s'arrête.\n\n# 3. Configurez vos clés API\nvim docker/data/config.json # Clés API du fournisseur, tokens de bot, etc.\n\n# 4. Démarrer\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Utilisateurs Docker** : Par défaut, le Gateway écoute sur `127.0.0.1`, ce qui n'est pas accessible depuis l'hôte. Si vous avez besoin d'accéder aux endpoints de santé ou d'exposer des ports, définissez `MALIKCLAW_GATEWAY_HOST=0.0.0.0` dans votre environnement ou mettez à jour `config.json`.\n\n```bash\n# 5. Voir les logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Arrêter\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Mode Agent (exécution unique)\n\n```bash\n# Poser une question\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Combien font 2+2 ?\"\n\n# Mode interactif\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Mettre à jour\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Démarrage Rapide\n\n> [!TIP]\n> Configurez votre clé API dans `~/.malikclaw/config.json`. Obtenez des clés API : [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). La recherche web est optionnelle — obtenez gratuitement l'[API Tavily](https://tavily.com) (1000 requêtes gratuites/mois) ou l'[API Brave Search](https://brave.com/search/api) (2000 requêtes gratuites/mois).\n\n**1. Initialiser**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurer** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"VOTRE_TOKEN_BOT\",\n \"allow_from\": [\"VOTRE_USER_ID\"]\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"VOTRE_CLE_API_BRAVE\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Nouveau** : Le format de configuration `model_list` permet d'ajouter des fournisseurs sans modifier le code. Voir [Configuration de Modèle](#configuration-de-modèle-model_list) pour plus de détails.\n> `request_timeout` est optionnel et s'exprime en secondes. S'il est omis ou défini à `<= 0`, MalikClaw utilise le délai d'expiration par défaut (120s).\n\n**3. Obtenir des Clés API**\n\n* **Fournisseur LLM** : [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Recherche Web** (optionnel) : [Brave Search](https://brave.com/search/api) - Offre gratuite disponible (2000 requêtes/mois)\n\n> **Note** : Consultez `config.example.json` pour un modèle de configuration complet.\n\n**4. Discuter**\n\n```bash\nmalikclaw agent -m \"Combien font 2+2 ?\"\n```\n\nEt voilà ! Vous avez un assistant IA fonctionnel en 2 minutes.\n\n---\n\n## 💬 Applications de Chat\n\nDiscutez avec votre MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom\n\n| Canal | Configuration |\n| ------------ | -------------------------------------- |\n| **Telegram** | Facile (juste un token) |\n| **Discord** | Facile (token bot + intents) |\n| **QQ** | Facile (AppID + AppSecret) |\n| **DingTalk** | Moyen (identifiants de l'application) |\n| **LINE** | Moyen (identifiants + URL de webhook) |\n| **WeCom AI Bot** | Moyen (Token + clé AES) |\n\n<details>\n<summary><b>Telegram</b> (Recommandé)</summary>\n\n**1. Créer un bot**\n\n* Ouvrez Telegram, recherchez `@BotFather`\n* Envoyez `/newbot`, suivez les instructions\n* Copiez le token\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"VOTRE_TOKEN_BOT\",\n \"allow_from\": [\"VOTRE_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenez votre User ID via `@userinfobot` sur Telegram.\n\n**3. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Créer un bot**\n\n* Rendez-vous sur <https://discord.com/developers/applications>\n* Créez une application → Bot → Add Bot\n* Copiez le token du bot\n\n**2. Activer les intents**\n\n* Dans les paramètres du Bot, activez **MESSAGE CONTENT INTENT**\n* (Optionnel) Activez **SERVER MEMBERS INTENT** si vous souhaitez utiliser des listes d'autorisation basées sur les données des membres\n\n**3. Obtenir votre User ID**\n\n* Paramètres Discord → Avancé → activez le **Mode Développeur**\n* Clic droit sur votre avatar → **Copier l'identifiant**\n\n**4. Configurer**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"VOTRE_TOKEN_BOT\",\n \"allow_from\": [\"VOTRE_USER_ID\"]\n }\n }\n}\n```\n\n**5. Inviter le bot**\n\n* OAuth2 → URL Generator\n* Scopes : `bot`\n* Permissions du Bot : `Send Messages`, `Read Message History`\n* Ouvrez l'URL d'invitation générée et ajoutez le bot à votre serveur\n\n**6. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Créer un bot**\n\n- Rendez-vous sur la [QQ Open Platform](https://q.qq.com/#)\n- Créez une application → Obtenez l'**AppID** et l'**AppSecret**\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"VOTRE_APP_ID\",\n \"app_secret\": \"VOTRE_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Laissez `allow_from` vide pour autoriser tous les utilisateurs, ou spécifiez des numéros QQ pour restreindre l'accès.\n\n**3. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Créer un bot**\n\n* Rendez-vous sur la [Open Platform](https://open.dingtalk.com/)\n* Créez une application interne\n* Copiez le Client ID et le Client Secret\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"VOTRE_CLIENT_ID\",\n \"client_secret\": \"VOTRE_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Laissez `allow_from` vide pour autoriser tous les utilisateurs, ou spécifiez des identifiants pour restreindre l'accès.\n\n**3. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Créer un Compte Officiel LINE**\n\n- Rendez-vous sur la [LINE Developers Console](https://developers.line.biz/)\n- Créez un provider → Créez un canal Messaging API\n- Copiez le **Channel Secret** et le **Channel Access Token**\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"VOTRE_CHANNEL_SECRET\",\n \"channel_access_token\": \"VOTRE_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurer l'URL du Webhook**\n\nLINE exige HTTPS pour les webhooks. Utilisez un reverse proxy ou un tunnel :\n\n```bash\n# Exemple avec ngrok (tunnel vers le serveur Gateway partagé)\nngrok http 18790\n```\n\nPuis configurez l'URL du Webhook dans la LINE Developers Console sur `https://votre-domaine/webhook/line` et activez **Use webhook**.\n\n> **Note** : Le webhook LINE est servi par le serveur Gateway partagé (par défaut `127.0.0.1:18790`). Si vous utilisez ngrok ou un proxy inverse, faites pointer le tunnel vers le port `18790`.\n\n**4. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n> Dans les discussions de groupe, le bot répond uniquement lorsqu'il est mentionné avec @. Les réponses citent le message original.\n\n> **Docker Compose** : Si vous avez besoin d'exposer le webhook LINE via Docker, mappez le port du Gateway partagé (par défaut `18790`) vers l'hôte, par exemple `ports: [\"18790:18790\"]`. Notez que le serveur Gateway sert les webhooks de tous les canaux à partir de ce port.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nMalikClaw prend en charge trois types d'intégration WeCom :\n\n**Option 1 : WeCom Bot (Robot)** - Configuration plus facile, prend en charge les discussions de groupe\n**Option 2 : WeCom App (Application Personnalisée)** - Plus de fonctionnalités, messagerie proactive, chat privé uniquement\n**Option 3 : WeCom AI Bot (Bot Intelligent)** - Bot IA officiel, réponses en streaming, prend en charge groupe et privé\n\nVoir le [Guide de Configuration WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) pour des instructions détaillées.\n\n**Configuration Rapide - WeCom Bot :**\n\n**1. Créer un bot**\n\n* Accédez à la Console d'Administration WeCom → Discussion de Groupe → Ajouter un Bot de Groupe\n* Copiez l'URL du webhook (format : `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuration Rapide - WeCom App :**\n\n**1. Créer une application**\n\n* Accédez à la Console d'Administration WeCom → Gestion des Applications → Créer une Application\n* Copiez l'**AgentId** et le **Secret**\n* Accédez à la page \"Mon Entreprise\", copiez le **CorpID**\n\n**2. Configurer la réception des messages**\n\n* Dans les détails de l'application, cliquez sur \"Recevoir les Messages\" → \"Configurer l'API\"\n* Définissez l'URL sur `http://your-server:18790/webhook/wecom-app`\n* Générez le **Token** et l'**EncodingAESKey**\n\n**3. Configurer**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n> **Note** : Les callbacks webhook WeCom App sont servis par le serveur Gateway partagé (par défaut `127.0.0.1:18790`). Assurez-vous que le port `18790` est accessible ou utilisez un proxy inverse HTTPS en production.\n\n**Configuration Rapide - WeCom AI Bot :**\n\n**1. Créer un AI Bot**\n\n* Accédez à la Console d'Administration WeCom → Gestion des Applications → AI Bot\n* Configurez l'URL de callback : `http://your-server:18791/webhook/wecom-aibot`\n* Copiez le **Token** et générez l'**EncodingAESKey**\n\n**2. Configurer**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Bonjour ! Comment puis-je vous aider ?\"\n }\n }\n}\n```\n\n**3. Lancer**\n\n```bash\nmalikclaw gateway\n```\n\n> **Note** : WeCom AI Bot utilise le protocole pull en streaming — pas de problème de timeout. Les tâches longues (>5,5 min) basculent automatiquement vers la livraison via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Rejoignez le Réseau Social d'Agents\n\nConnectez MalikClaw au Réseau Social d'Agents simplement en envoyant un seul message via le CLI ou n'importe quelle application de chat intégrée.\n\n**Lisez `https://clawdchat.ai/skill.md` et suivez les instructions pour rejoindre [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuration\n\nFichier de configuration : `~/.malikclaw/config.json`\n\n### Variables d'Environnement\n\nVous pouvez remplacer les chemins par défaut à l'aide de variables d'environnement. Ceci est utile pour les installations portables, les déploiements conteneurisés ou l'exécution de malikclaw en tant que service système. Ces variables sont indépendantes et contrôlent différents chemins.\n\n| Variable | Description | Chemin par Défaut |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Remplace le chemin du fichier de configuration. Cela indique directement à malikclaw quel `config.json` charger, en ignorant tous les autres emplacements. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Remplace le répertoire racine des données malikclaw. Cela modifie l'emplacement par défaut du `workspace` et des autres répertoires de données. | `~/.malikclaw` |\n\n**Exemples :**\n\n```bash\n# Exécuter malikclaw en utilisant un fichier de configuration spécifique\n# Le chemin du workspace sera lu à partir de ce fichier de configuration\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Exécuter malikclaw avec toutes ses données stockées dans /opt/malikclaw\n# La configuration sera chargée à partir du fichier par défaut ~/.malikclaw/config.json\n# Le workspace sera créé dans /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Utiliser les deux pour une configuration entièrement personnalisée\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Structure du Workspace\n\nMalikClaw stocke les données dans votre workspace configuré (par défaut : `~/.malikclaw/workspace`) :\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessions de conversation et historique\n├── memory/ # Mémoire à long terme (MEMORY.md)\n├── state/ # État persistant (dernier canal, etc.)\n├── cron/ # Base de données des tâches planifiées\n├── skills/ # Compétences personnalisées\n├── AGENTS.md # Guide de comportement de l'Agent\n├── HEARTBEAT.md # Invites de tâches périodiques (vérifiées toutes les 30 min)\n├── IDENTITY.md # Identité de l'Agent\n├── SOUL.md # Âme de l'Agent\n└── USER.md # Préférences utilisateur\n```\n\n### 🔒 Bac à Sable de Sécurité\n\nMalikClaw s'exécute dans un environnement sandboxé par défaut. L'agent ne peut accéder aux fichiers et exécuter des commandes qu'au sein du workspace configuré.\n\n#### Configuration par Défaut\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Option | Par défaut | Description |\n|--------|------------|-------------|\n| `workspace` | `~/.malikclaw/workspace` | Répertoire de travail de l'agent |\n| `restrict_to_workspace` | `true` | Restreindre l'accès fichiers/commandes au workspace |\n\n#### Outils Protégés\n\nLorsque `restrict_to_workspace: true`, les outils suivants sont restreints au bac à sable :\n\n| Outil | Fonction | Restriction |\n|-------|----------|-------------|\n| `read_file` | Lire des fichiers | Uniquement les fichiers dans le workspace |\n| `write_file` | Écrire des fichiers | Uniquement les fichiers dans le workspace |\n| `list_dir` | Lister des répertoires | Uniquement les répertoires dans le workspace |\n| `edit_file` | Éditer des fichiers | Uniquement les fichiers dans le workspace |\n| `append_file` | Ajouter à des fichiers | Uniquement les fichiers dans le workspace |\n| `exec` | Exécuter des commandes | Les chemins doivent être dans le workspace |\n\n#### Protection Supplémentaire d'Exec\n\nMême avec `restrict_to_workspace: false`, l'outil `exec` bloque ces commandes dangereuses :\n\n* `rm -rf`, `del /f`, `rmdir /s` — Suppression en masse\n* `format`, `mkfs`, `diskpart` — Formatage de disque\n* `dd if=` — Écriture d'image disque\n* Écriture vers `/dev/sd[a-z]` — Écriture directe sur le disque\n* `shutdown`, `reboot`, `poweroff` — Arrêt du système\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemples d'Erreurs\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Désactiver les Restrictions (Risque de Sécurité)\n\nSi vous avez besoin que l'agent accède à des chemins en dehors du workspace :\n\n**Méthode 1 : Fichier de configuration**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Méthode 2 : Variable d'environnement**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Attention** : Désactiver cette restriction permet à l'agent d'accéder à n'importe quel chemin sur votre système. À utiliser avec précaution uniquement dans des environnements contrôlés.\n\n#### Cohérence du Périmètre de Sécurité\n\nLe paramètre `restrict_to_workspace` s'applique de manière cohérente sur tous les chemins d'exécution :\n\n| Chemin d'Exécution | Périmètre de Sécurité |\n|--------------------|----------------------|\n| Agent Principal | `restrict_to_workspace` ✅ |\n| Sous-agent / Spawn | Hérite de la même restriction ✅ |\n| Tâches Heartbeat | Hérite de la même restriction ✅ |\n\nTous les chemins partagent la même restriction de workspace — il est impossible de contourner le périmètre de sécurité via des sous-agents ou des tâches planifiées.\n\n### Heartbeat (Tâches Périodiques)\n\nMalikClaw peut exécuter des tâches périodiques automatiquement. Créez un fichier `HEARTBEAT.md` dans votre workspace :\n\n```markdown\n# Tâches Périodiques\n\n- Vérifier mes e-mails pour les messages importants\n- Consulter mon agenda pour les événements à venir\n- Vérifier les prévisions météo\n```\n\nL'agent lira ce fichier toutes les 30 minutes (configurable) et exécutera les tâches à l'aide des outils disponibles.\n\n#### Tâches Asynchrones avec Spawn\n\nPour les tâches de longue durée (recherche web, appels API), utilisez l'outil `spawn` pour créer un **sous-agent** :\n\n```markdown\n# Tâches Périodiques\n\n## Tâches Rapides (réponse directe)\n- Indiquer l'heure actuelle\n\n## Tâches Longues (utiliser spawn pour l'asynchrone)\n- Rechercher les actualités IA sur le web et les résumer\n- Vérifier les e-mails et signaler les messages importants\n```\n\n**Comportements clés :**\n\n| Fonctionnalité | Description |\n|----------------|-------------|\n| **spawn** | Crée un sous-agent asynchrone, ne bloque pas le heartbeat |\n| **Contexte indépendant** | Le sous-agent a son propre contexte, sans historique de session |\n| **Outil message** | Le sous-agent communique directement avec l'utilisateur via l'outil message |\n| **Non-bloquant** | Après le spawn, le heartbeat continue vers la tâche suivante |\n\n#### Fonctionnement de la Communication du Sous-agent\n\n```\nLe Heartbeat se déclenche\n ↓\nL'Agent lit HEARTBEAT.md\n ↓\nPour une tâche longue : spawn d'un sous-agent\n ↓ ↓\nContinue la tâche suivante Le sous-agent travaille indépendamment\n ↓ ↓\nToutes les tâches terminées Le sous-agent utilise l'outil \"message\"\n ↓ ↓\nRépond HEARTBEAT_OK L'utilisateur reçoit le résultat directement\n```\n\nLe sous-agent a accès aux outils (message, web_search, etc.) et peut communiquer avec l'utilisateur indépendamment sans passer par l'agent principal.\n\n**Configuration :**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Option | Par défaut | Description |\n|--------|------------|-------------|\n| `enabled` | `true` | Activer/désactiver le heartbeat |\n| `interval` | `30` | Intervalle de vérification en minutes (min : 5) |\n\n**Variables d'environnement :**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` pour désactiver\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` pour modifier l'intervalle\n\n### Fournisseurs\n\n> [!NOTE]\n> Groq fournit la transcription vocale gratuite via Whisper. Si configuré, les messages audio de n'importe quel canal seront automatiquement transcrits au niveau de l'agent.\n\n| Fournisseur | Utilisation | Obtenir une Clé API |\n| ------------------------ | ---------------------------------------- | ------------------------------------------------------ |\n| `gemini` | LLM (Gemini direct) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direct) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direct) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (À tester) | LLM (recommandé, accès à tous les modèles) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (À tester) | LLM (Claude direct) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (À tester) | LLM (GPT direct) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (À tester) | LLM (DeepSeek direct) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | LLM (Alibaba Qwen) | [dashscope.aliyuncs.com](https://dashscope.aliyuncs.com/compatible-mode/v1) |\n| `cerebras` | LLM (Cerebras) | [cerebras.ai](https://api.cerebras.ai/v1) |\n| `groq` | LLM + **Transcription vocale** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuration Zhipu</b></summary>\n\n**1. Obtenir la clé API**\n\n* Obtenez la [clé API](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurer**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Votre Clé API\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Lancer**\n\n```bash\nmalikclaw agent -m \"Bonjour, comment ça va ?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemple de configuration complète</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuration de Modèle (model_list)\n\n> **Nouveau !** MalikClaw utilise désormais une approche de configuration **centrée sur le modèle**. Spécifiez simplement le format `fournisseur/modèle` (par exemple, `zhipu/glm-4.7`) pour ajouter de nouveaux fournisseurs—**aucune modification de code requise !**\n\nCette conception permet également le **support multi-agent** avec une sélection flexible de fournisseurs :\n\n- **Différents agents, différents fournisseurs** : Chaque agent peut utiliser son propre fournisseur LLM\n- **Modèles de secours (Fallbacks)** : Configurez des modèles primaires et de secours pour la résilience\n- **Équilibrage de charge** : Répartissez les requêtes sur plusieurs points de terminaison\n- **Configuration centralisée** : Gérez tous les fournisseurs en un seul endroit\n\n#### 📋 Tous les Fournisseurs Supportés\n\n| Fournisseur | Préfixe `model` | API Base par Défaut | Protocole | Clé API |\n|-------------|-----------------|---------------------|----------|---------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obtenir Clé](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obtenir Clé](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obtenir Clé](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obtenir Clé](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obtenir Clé](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obtenir Clé](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obtenir Clé](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obtenir Clé](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obtenir Clé](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (pas de clé nécessaire) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obtenir Clé](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obtenir Clé](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obtenir Clé](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obtenir Clé](https://www.byteplus.com/) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obtenir une clé](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obtenir un Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | OAuth uniquement |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuration de Base\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemples par Fournisseur\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (avec OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Exécutez `malikclaw auth login --provider anthropic` pour configurer les identifiants OAuth.\n\n**Proxy/API personnalisée**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Équilibrage de Charge\n\nConfigurez plusieurs points de terminaison pour le même nom de modèle—MalikClaw utilisera automatiquement le round-robin entre eux :\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migration depuis l'Ancienne Configuration `providers`\n\nL'ancienne configuration `providers` est **dépréciée** mais toujours supportée pour la rétrocompatibilité.\n\n**Ancienne Configuration (dépréciée) :**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nouvelle Configuration (recommandée) :**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPour le guide de migration détaillé, voir [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Référence CLI\n\n| Commande | Description |\n| ------------------------- | ------------------------------------- |\n| `malikclaw onboard` | Initialiser la configuration & le workspace |\n| `malikclaw agent -m \"...\"` | Discuter avec l'agent |\n| `malikclaw agent` | Mode de discussion interactif |\n| `malikclaw gateway` | Démarrer la passerelle |\n| `malikclaw status` | Afficher le statut |\n| `malikclaw cron list` | Lister toutes les tâches planifiées |\n| `malikclaw cron add ...` | Ajouter une tâche planifiée |\n\n### Tâches Planifiées / Rappels\n\nMalikClaw prend en charge les rappels planifiés et les tâches récurrentes via l'outil `cron` :\n\n* **Rappels ponctuels** : « Rappelle-moi dans 10 minutes » → se déclenche une fois après 10 min\n* **Tâches récurrentes** : « Rappelle-moi toutes les 2 heures » → se déclenche toutes les 2 heures\n* **Expressions Cron** : « Rappelle-moi à 9h tous les jours » → utilise une expression cron\n\nLes tâches sont stockées dans `~/.malikclaw/workspace/cron/` et traitées automatiquement.\n\n## 🤝 Contribuer & Feuille de Route\n\nLes PR sont les bienvenues ! Le code source est volontairement petit et lisible. 🤗\n\nFeuille de route à venir...\n\nGroupe de développeurs en construction. Condition d'entrée : au moins 1 PR fusionnée.\n\nGroupes d'utilisateurs :\n\nDiscord : <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Dépannage\n\n### La recherche web affiche « API 配置问题 »\n\nC'est normal si vous n'avez pas encore configuré de clé API de recherche. MalikClaw fournira des liens utiles pour la recherche manuelle.\n\nPour activer la recherche web :\n\n1. **Option 1 (Recommandé)** : Obtenez une clé API gratuite sur [https://brave.com/search/api](https://brave.com/search/api) (2000 requêtes gratuites/mois) pour les meilleurs résultats.\n2. **Option 2 (Sans carte bancaire)** : Si vous n'avez pas de clé, le système bascule automatiquement sur **DuckDuckGo** (aucune clé requise).\n\nAjoutez la clé dans `~/.malikclaw/config.json` si vous utilisez Brave :\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"VOTRE_CLE_API_BRAVE\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erreurs de filtrage de contenu\n\nCertains fournisseurs (comme Zhipu) disposent d'un filtrage de contenu. Essayez de reformuler votre requête ou utilisez un modèle différent.\n\n### Le bot Telegram affiche « Conflict: terminated by other getUpdates »\n\nCela se produit lorsqu'une autre instance du bot est en cours d'exécution. Assurez-vous qu'un seul `malikclaw gateway` fonctionne à la fois.\n\n---\n\n## 📝 Comparaison des Clés API\n\n| Service | Offre Gratuite | Cas d'Utilisation |\n| ---------------- | -------------------- | ------------------------------------- |\n| **OpenRouter** | 200K tokens/mois | Multiples modèles (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | 9,9¥/premier mois | Idéal pour les utilisateurs chinois, multiples modèles SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mois | Convient aux utilisateurs chinois |\n| **Brave Search** | 2000 requêtes/mois | Fonctionnalité de recherche web |\n| **Groq** | Offre gratuite dispo | Inférence ultra-rapide (Llama, Mixtral) |\n| **ModelScope** | 2000 requêtes/jour | Inférence gratuite (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}}, "README.pt-br.md": {"7b53c27818f2fe5f37c2c6d06131af812268e82f": {"t": 1785674179.5201015, "n": 42148, "h": "23f50e8dc9aaadaa", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Ultra-Efficient Personal AI Assistant for Edge Hardware</h3>\n <p><strong>$10 Hardware · &lt;10MB RAM · &lt;1s Boot · آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Multi-Architecture Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/pulls\"><img src=\"https://img.shields.io/github/issues-pr/AbdullahMalik17/malikclaw\" alt=\"GitHub pull requests\"></a>\n <br>\n <img src=\"https://img.shields.io/github/languages/code-size/AbdullahMalik17/malikclaw\" alt=\"GitHub code size\">\n <img src=\"https://img.shields.io/github/contributors/AbdullahMalik17/malikclaw\" alt=\"GitHub contributors\">\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n[اردو](README.ur.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 Atualização Importante (Março 2026)**\n>\n> Esta tradução pode estar desatualizada. Para informações mais recentes, consulte a versão em inglês: **[README.md](README.md)**\n>\n> **Novidade:** Loop de agente de produção com PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE. Veja [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 **MalikClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O MalikClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[malikclaw.io](https://malikclaw.vercel.app)**, e o site da empresa é o **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O MalikClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O MalikClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 MalikClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O MalikClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 MalikClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do MalikClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 MalikClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 MalikClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o MalikClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO MalikClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o MalikClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `MALIKCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.malikclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurar** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o MalikClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\nmalikclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO MalikClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `MALIKCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o MalikClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.malikclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o malikclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao malikclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Substitui o diretório raiz dos dados do malikclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.malikclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o malikclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Executar o malikclaw com todos os seus dados armazenados em /opt/malikclaw\n# A configuração será carregada do ~/.malikclaw/config.json padrão\n# O workspace será criado em /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Estrutura do Workspace\n\nO MalikClaw armazena dados no workspace configurado (padrão: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO MalikClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.malikclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO MalikClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** MalikClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `malikclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—MalikClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `malikclaw onboard` | Inicializar configuração & workspace |\n| `malikclaw agent -m \"...\"` | Conversar com o agente |\n| `malikclaw agent` | Modo de chat interativo |\n| `malikclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `malikclaw status` | Mostrar status |\n| `malikclaw cron list` | Listar todas as tarefas agendadas |\n| `malikclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO MalikClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.malikclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O MalikClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.malikclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `malikclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "51dc2c4b239a5a6e9abd197b12e0638ced0501da": {"t": 1785759455.8641515, "n": 41796, "h": "561d5a2bc30a92f0", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Ultra-Efficient Personal AI Assistant for Edge Hardware</h3>\n <p><strong>$10 Hardware · &lt;10MB RAM · &lt;1s Boot · آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Multi-Architecture Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/pulls\"><img src=\"https://img.shields.io/github/issues-pr/AbdullahMalik17/malikclaw\" alt=\"GitHub pull requests\"></a>\n <br>\n <img src=\"https://img.shields.io/github/languages/code-size/AbdullahMalik17/malikclaw\" alt=\"GitHub code size\">\n <img src=\"https://img.shields.io/github/contributors/AbdullahMalik17/malikclaw\" alt=\"GitHub contributors\">\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n[اردو](README.ur.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n\n</div>\n\n---\n\n🦐 **MalikClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O MalikClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[malikclaw.io](https://malikclaw.vercel.app)**, e o site da empresa é o **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O MalikClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O MalikClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 MalikClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O MalikClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 MalikClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do MalikClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 MalikClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 MalikClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o MalikClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO MalikClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o MalikClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `MALIKCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.malikclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurar** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o MalikClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\nmalikclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO MalikClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `MALIKCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o MalikClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.malikclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o malikclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao malikclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Substitui o diretório raiz dos dados do malikclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.malikclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o malikclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Executar o malikclaw com todos os seus dados armazenados em /opt/malikclaw\n# A configuração será carregada do ~/.malikclaw/config.json padrão\n# O workspace será criado em /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Estrutura do Workspace\n\nO MalikClaw armazena dados no workspace configurado (padrão: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO MalikClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.malikclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO MalikClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** MalikClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `malikclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—MalikClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `malikclaw onboard` | Inicializar configuração & workspace |\n| `malikclaw agent -m \"...\"` | Conversar com o agente |\n| `malikclaw agent` | Modo de chat interativo |\n| `malikclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `malikclaw status` | Mostrar status |\n| `malikclaw cron list` | Listar todas as tarefas agendadas |\n| `malikclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO MalikClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.malikclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O MalikClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.malikclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `malikclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "a1680e44d0a65017e36dff4c69a9484af9992c80": {"t": 1785759457.7928474, "n": 40081, "h": "3abaa8d52ce5726b", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw\" width=\"512\">\n\n\n<h1>MalikClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/AbdullahMalik17\"><img src=\"https://img.shields.io/badge/X_(Twitter)-AbdullahMalik17-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **MalikClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O MalikClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[malikclaw.io](https://malikclaw.vercel.app)**, e o site da empresa é o **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O MalikClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O MalikClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 MalikClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O MalikClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 MalikClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do MalikClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 MalikClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 MalikClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o MalikClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO MalikClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o MalikClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `MALIKCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.malikclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurar** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o MalikClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\nmalikclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO MalikClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `MALIKCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o MalikClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.malikclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o malikclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao malikclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Substitui o diretório raiz dos dados do malikclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.malikclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o malikclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Executar o malikclaw com todos os seus dados armazenados em /opt/malikclaw\n# A configuração será carregada do ~/.malikclaw/config.json padrão\n# O workspace será criado em /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Estrutura do Workspace\n\nO MalikClaw armazena dados no workspace configurado (padrão: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO MalikClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.malikclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO MalikClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** MalikClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `malikclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—MalikClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `malikclaw onboard` | Inicializar configuração & workspace |\n| `malikclaw agent -m \"...\"` | Conversar com o agente |\n| `malikclaw agent` | Modo de chat interativo |\n| `malikclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `malikclaw status` | Mostrar status |\n| `malikclaw cron list` | Listar todas as tarefas agendadas |\n| `malikclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO MalikClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.malikclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O MalikClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.malikclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `malikclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "b1819ede2b4c840de1a292b1cfe8b6d19832b09f": {"t": 1785759459.1794407, "n": 40057, "h": "a805db58544164c9", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw\" width=\"512\">\n\n\n<h1>MalikClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://malikclaw.io\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/AbdullahMalik17\"><img src=\"https://img.shields.io/badge/X_(Twitter)-AbdullahMalik17-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **MalikClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O MalikClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[malikclaw.io](https://malikclaw.io)**, e o site da empresa é o **[malikclaw.io](https://malikclaw.io)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O MalikClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O MalikClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 MalikClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O MalikClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 MalikClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do MalikClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 MalikClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 MalikClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o MalikClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO MalikClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o MalikClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `MALIKCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.malikclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurar** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o MalikClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\nmalikclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO MalikClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `MALIKCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o MalikClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.malikclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o malikclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao malikclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Substitui o diretório raiz dos dados do malikclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.malikclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o malikclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Executar o malikclaw com todos os seus dados armazenados em /opt/malikclaw\n# A configuração será carregada do ~/.malikclaw/config.json padrão\n# O workspace será criado em /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Estrutura do Workspace\n\nO MalikClaw armazena dados no workspace configurado (padrão: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO MalikClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.malikclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO MalikClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** MalikClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `malikclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—MalikClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `malikclaw onboard` | Inicializar configuração & workspace |\n| `malikclaw agent -m \"...\"` | Conversar com o agente |\n| `malikclaw agent` | Modo de chat interativo |\n| `malikclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `malikclaw status` | Mostrar status |\n| `malikclaw cron list` | Listar todas as tarefas agendadas |\n| `malikclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO MalikClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.malikclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O MalikClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.malikclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `malikclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "842bcbfec51ca3da0fbc771f225028d3a70d936f": {"t": 1785759461.2819626, "n": 40054, "h": "890d264114cfa8f9", "c": "<div align=\"center\">\n<img src=\"assets/logo.webp\" alt=\"MalikClaw\" width=\"512\">\n\n<h1>MalikClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://malikclaw.io\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/AbdullahMalik17\"><img src=\"https://img.shields.io/badge/X_(Twitter)-AbdullahMalik17-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **MalikClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O MalikClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[malikclaw.io](https://malikclaw.io)**, e o site da empresa é o **[malikclaw.io](https://malikclaw.io)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O MalikClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O MalikClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 MalikClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O MalikClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 MalikClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do MalikClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 MalikClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 MalikClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o MalikClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO MalikClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o MalikClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `MALIKCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.malikclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurar** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o MalikClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\nmalikclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO MalikClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `MALIKCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o MalikClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.malikclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o malikclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao malikclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Substitui o diretório raiz dos dados do malikclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.malikclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o malikclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Executar o malikclaw com todos os seus dados armazenados em /opt/malikclaw\n# A configuração será carregada do ~/.malikclaw/config.json padrão\n# O workspace será criado em /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Estrutura do Workspace\n\nO MalikClaw armazena dados no workspace configurado (padrão: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO MalikClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.malikclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO MalikClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** MalikClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `malikclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—MalikClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `malikclaw onboard` | Inicializar configuração & workspace |\n| `malikclaw agent -m \"...\"` | Conversar com o agente |\n| `malikclaw agent` | Modo de chat interativo |\n| `malikclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `malikclaw status` | Mostrar status |\n| `malikclaw cron list` | Listar todas as tarefas agendadas |\n| `malikclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO MalikClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.malikclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O MalikClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.malikclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `malikclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "423e1071ce742174ca8236def7dad12d22e5578c": {"t": 1785759463.914739, "n": 40000, "h": "d241378b27449aa0", "c": "<div align=\"center\">\n<img src=\"assets/logo.webp\" alt=\"MalikClaw\" width=\"512\">\n\n<h1>MalikClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://malikclaw.io\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **MalikClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O MalikClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[malikclaw.io](https://malikclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O MalikClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O MalikClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 MalikClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O MalikClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 MalikClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do MalikClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 MalikClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 MalikClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o MalikClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO MalikClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/malikclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o MalikClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/malikclaw.git\ncd malikclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `MALIKCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.malikclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurar** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o MalikClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\nmalikclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO MalikClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `MALIKCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o MalikClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.malikclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o malikclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao malikclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Substitui o diretório raiz dos dados do malikclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.malikclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o malikclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Executar o malikclaw com todos os seus dados armazenados em /opt/malikclaw\n# A configuração será carregada do ~/.malikclaw/config.json padrão\n# O workspace será criado em /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Estrutura do Workspace\n\nO MalikClaw armazena dados no workspace configurado (padrão: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO MalikClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.malikclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO MalikClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** MalikClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `malikclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—MalikClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `malikclaw onboard` | Inicializar configuração & workspace |\n| `malikclaw agent -m \"...\"` | Conversar com o agente |\n| `malikclaw agent` | Modo de chat interativo |\n| `malikclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `malikclaw status` | Mostrar status |\n| `malikclaw cron list` | Listar todas as tarefas agendadas |\n| `malikclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO MalikClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.malikclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O MalikClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.malikclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `malikclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "555af137b4feed27f1046e9680a6a6ed390f0a52": {"t": 1785759466.2401047, "n": 39883, "h": "b7fb75d43d5cf1c3", "c": "<div align=\"center\">\n<img src=\"assets/logo.webp\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"PicoClaw Meme\" width=\"512\">\n</div>\n"}, "b811e9186cf2e07847bd1c1257222865b231ed33": {"t": 1785759468.0009968, "n": 39815, "h": "19fce1b09e4a75c4", "c": "<div align=\"center\">\n<img src=\"assets/logo.webp\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"PicoClaw Meme\" width=\"512\">\n</div>\n"}, "f01eeac300630100284bd30b2987832c9f10107f": {"t": 1785759471.2579098, "n": 39548, "h": "08908e09b1377c3f", "c": "<div align=\"center\">\n<img src=\"assets/logo.webp\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=PicoClaw&utm_content=PicoClaw&utm_medium=devrel&utm_source=OWO&utm_term=PicoClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"PicoClaw Meme\" width=\"512\">\n</div>\n"}, "1e024321c06b78e1b77e05229a7f63ab741ad8ab": {"t": 1785759472.9962232, "n": 39091, "h": "8eaf10bc4a8d2176", "c": "<div align=\"center\">\n<img src=\"assets/logo.webp\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://console.volcengine.com) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"PicoClaw Meme\" width=\"512\">\n</div>\n"}, "8cac29d9bb3370db54db54226ba2b3a4b18dac74": {"t": 1785759474.6872013, "n": 38177, "h": "d4fc362ed834c5e4", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "9222351871994df738ef2a09559afb60e2ce138f": {"t": 1785759476.2864356, "n": 38228, "h": "8008a9a9f3324466", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "c3af1543db7664c704ef42c89ac93aa5fe56cfae": {"t": 1785759479.3021538, "n": 38051, "h": "30782b4782a03e44", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "3e5b849984c81b0b8071aa079ed40c29a75fa4b3": {"t": 1785759480.9677882, "n": 38035, "h": "4fae16734ea9b0d7", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "bf4445f1f333194c4b8381752f13fbef273efd9e": {"t": 1785759482.9991992, "n": 38008, "h": "34fb013f8659ee5b", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "a25726e7981ba8b184b401c9f198b5525fb06a41": {"t": 1785759485.518382, "n": 38070, "h": "7dbb8db5e5dfb6fb", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "d4bc28c11366b9f9b787ecd0d540591214f97473": {"t": 1785759487.9550748, "n": 37047, "h": "a4179ac07060e77a", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o picoclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `PICOCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao picoclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.picoclaw/config.json` |\n| `PICOCLAW_HOME` | Substitui o diretório raiz dos dados do picoclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.picoclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o picoclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nPICOCLAW_CONFIG=/etc/picoclaw/production.json picoclaw gateway\n\n# Executar o picoclaw com todos os seus dados armazenados em /opt/picoclaw\n# A configuração será carregada do ~/.picoclaw/config.json padrão\n# O workspace será criado em /opt/picoclaw/workspace\nPICOCLAW_HOME=/opt/picoclaw picoclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nPICOCLAW_HOME=/srv/picoclaw PICOCLAW_CONFIG=/srv/picoclaw/main.json picoclaw gateway\n```\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "b1386ad71fbe43142b96deca018d73294df06fcc": {"t": 1785759489.6939707, "n": 35041, "h": "6a81e6d8462eafbd", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "c57a9c14e7ae6e1119c6b35a5a8e639be08ffbb4": {"t": 1785759492.8446221, "n": 35377, "h": "3cda0541c508d2ce", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `PICOCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "a5c8179fa854c67450e5a681282d8e459ab04d69": {"t": 1785759494.860246, "n": 35014, "h": "792fdfa9cb7f38cb", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f picoclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm picoclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "438f764c7ac0d7aa851bae45b04d2fdf5299f257": {"t": 1785759497.3515751, "n": 34686, "h": "a12bbd0238b100a9", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o PicoClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "d20cb364a27089595ba5458415461071d2e2ccf4": {"t": 1785759499.0886667, "n": 34148, "h": "729a042ca698592b", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "2fa51d7b868672ab2fd054396216fa68184b3ad6": {"t": 1785759500.6029704, "n": 34143, "h": "8463e7ce1b548c7c", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `PICOCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "e76e45f30f234a96d0d588aa0f2ec04a7bc934c5": {"t": 1785759502.0607073, "n": 33877, "h": "9e28db0bf11bfde1", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "712f5a8300f0ce9d9d22352a1bc92bed3a0c8b88": {"t": 1785759503.7347023, "n": 33903, "h": "61d8ecd5b0a701fc", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/picoclaw_community_roadmap_260216.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "8928f83c7ff254ec1c74bff1d03aca20220cb702": {"t": 1785759505.359746, "n": 33872, "h": "2d087eba13953aac", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "838a69085bafadd90175d8b1a52aa3547084222b": {"t": 1785759507.0470788, "n": 33898, "h": "4bbf6dc003e339c3", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/picoclaw_community_roadmap_260216.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt4\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\",\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n"}, "0f70f783bd88c5db875c1ebebe5bde902a96ab27": {"t": 1785759508.82221, "n": 33720, "h": "d6b445e6b3871170", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/picoclaw_community_roadmap_260216.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"xxx\",\n \"api_base\": \"https://openrouter.ai/api/v1\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom** | Médio (CorpID + configuração webhook) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allowFrom\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allowFrom\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO PicoClaw suporta dois tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô Inteligente)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas\n\nVeja o [Guia de Configuração WeCom App](docs/wecom-app-configuration.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18793,\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18792/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18792,\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> **Nota**: O WeCom App requer a abertura da porta 18792 para callbacks de webhook. Use um proxy reverso para HTTPS em produção.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": true,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n"}, "dc9fb327c2efdca728aa4a49ab21e311499f7021": {"t": 1785759510.4958017, "n": 31549, "h": "50b127573132a44e", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/picoclaw_community_roadmap_260216.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"xxx\",\n \"api_base\": \"https://openrouter.ai/api/v1\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk ou LINE.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allowFrom\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allowFrom\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": true,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n"}, "5cd1597674494b8620753099f653f0cbd7366ba3": {"t": 1785759512.2381396, "n": 31559, "h": "2b23c459a7359653", "c": "<div align=\"center\">\n<img src=\"assets/logo.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n<h1>PicoClaw: Assistente de IA Ultra-Eficiente em Go</h1>\n\n<h3>Hardware de $10 · 10MB de RAM · Boot em 1s · 皮皮虾,我们走!</h3>\n\n <p>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Go\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue\" alt=\"Hardware\">\n <img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\">\n <br>\n <a href=\"https://picoclaw.io\"><img src=\"https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Website\"></a>\n <a href=\"https://x.com/SipeedIO\"><img src=\"https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white\" alt=\"Twitter\"></a>\n </p>\n\n [中文](README.zh.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n</div>\n\n---\n\n🦐 **PicoClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/picoclaw_mem.gif\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O PicoClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[picoclaw.io](https://picoclaw.io)**, e o site da empresa é o **[sipeed.com](https://sipeed.com)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O PicoClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O PicoClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 PicoClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O PicoClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/picoclaw_community_roadmap_260216.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 PicoClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do PicoClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 PicoClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 PicoClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n| | OpenClaw | NanoBot | **PicoClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Linguagem** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Inicialização**</br>(CPU 0.8GHz) | >500s | >30s | **<1s** |\n| **Custo** | Mac Mini $599 | Maioria dos SBC Linux </br>~$50 | **Qualquer placa Linux**</br>**A partir de $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_code.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_memory.gif\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/picoclaw_search.gif\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o PicoClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/sipeed/picoclaw/releases/download/v0.1.1/picoclaw-linux-arm64\nchmod +x picoclaw-linux-arm64\npkg install proot\ntermux-chroot ./picoclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"PicoClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO PicoClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/sipeed/picoclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/sipeed/picoclaw.git\n\ncd picoclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o PicoClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/sipeed/picoclaw.git\ncd picoclaw\n\n# 2. Configure suas API keys\ncp config/config.example.json config/config.json\nvim config/config.json # Configure DISCORD_BOT_TOKEN, API keys, etc.\n\n# 3. Build & Iniciar\ndocker compose --profile gateway up -d\n\n# 4. Ver logs\ndocker compose logs -f picoclaw-gateway\n\n# 5. Parar\ndocker compose --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose run --rm picoclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose run --rm picoclaw-agent\n```\n\n### Rebuild\n\n```bash\ndocker compose --profile gateway build --no-cache\ndocker compose --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.picoclaw/config.json`.\n> Obtenha API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)\n> Busca web e **opcional** — obtenha a [Brave Search API](https://brave.com/search/api) gratuita (2000 consultas grátis/mês) ou use o fallback automático integrado.\n\n**1. Inicializar**\n\n```bash\npicoclaw onboard\n```\n\n**2. Configurar** (`~/.picoclaw/config.json`)\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"xxx\",\n \"api_base\": \"https://openrouter.ai/api/v1\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\npicoclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu PicoClaw via Telegram, Discord, DingTalk ou LINE.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allowFrom\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allowFrom\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\npicoclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_host\": \"0.0.0.0\",\n \"webhook_port\": 18791,\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18791\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n**4. Executar**\n\n```bash\npicoclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Adicione `ports: [\"18791:18791\"]` ao serviço `picoclaw-gateway` para expor a porta do webhook.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o PicoClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.picoclaw/config.json`\n\n### Estrutura do Workspace\n\nO PicoClaw armazena dados no workspace configurado (padrão: `~/.picoclaw/workspace`):\n\n```\n~/.picoclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n├── TOOLS.md # Descrição das ferramentas\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO PicoClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.picoclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO PicoClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `PICOCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `PICOCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de voz do Telegram serão automaticamente transcritas.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.picoclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\npicoclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** PicoClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **Volcengine** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://console.volcengine.com) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4\",\n \"model\": \"anthropic/claude-sonnet-4-20250514\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.2\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4\",\n \"model\": \"anthropic/claude-sonnet-4-20250514\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `picoclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—PicoClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.2\",\n \"model\": \"openai/gpt-5.2\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `picoclaw onboard` | Inicializar configuração & workspace |\n| `picoclaw agent -m \"...\"` | Conversar com o agente |\n| `picoclaw agent` | Modo de chat interativo |\n| `picoclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `picoclaw status` | Mostrar status |\n| `picoclaw cron list` | Listar todas as tarefas agendadas |\n| `picoclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO PicoClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.picoclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"PicoClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O PicoClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.picoclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": true,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `picoclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Zhipu** | 200K tokens/mês | Melhor para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n"}, "0a3535b70975f84f53461b2d904ee3cf40fbe294": {"t": 1785846843.4851775, "n": 42148, "h": "23f50e8dc9aaadaa", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Ultra-Efficient Personal AI Assistant for Edge Hardware</h3>\n <p><strong>$10 Hardware · &lt;10MB RAM · &lt;1s Boot · آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Multi-Architecture Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/pulls\"><img src=\"https://img.shields.io/github/issues-pr/AbdullahMalik17/malikclaw\" alt=\"GitHub pull requests\"></a>\n <br>\n <img src=\"https://img.shields.io/github/languages/code-size/AbdullahMalik17/malikclaw\" alt=\"GitHub code size\">\n <img src=\"https://img.shields.io/github/contributors/AbdullahMalik17/malikclaw\" alt=\"GitHub contributors\">\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n[اردو](README.ur.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 Atualização Importante (Março 2026)**\n>\n> Esta tradução pode estar desatualizada. Para informações mais recentes, consulte a versão em inglês: **[README.md](README.md)**\n>\n> **Novidade:** Loop de agente de produção com PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE. Veja [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 **MalikClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O MalikClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[malikclaw.io](https://malikclaw.vercel.app)**, e o site da empresa é o **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O MalikClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O MalikClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 MalikClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O MalikClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 MalikClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do MalikClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 MalikClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 MalikClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o MalikClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO MalikClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o MalikClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `MALIKCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.malikclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurar** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o MalikClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\nmalikclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO MalikClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `MALIKCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o MalikClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.malikclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o malikclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao malikclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Substitui o diretório raiz dos dados do malikclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.malikclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o malikclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Executar o malikclaw com todos os seus dados armazenados em /opt/malikclaw\n# A configuração será carregada do ~/.malikclaw/config.json padrão\n# O workspace será criado em /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Estrutura do Workspace\n\nO MalikClaw armazena dados no workspace configurado (padrão: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO MalikClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.malikclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO MalikClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** MalikClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `malikclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—MalikClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `malikclaw onboard` | Inicializar configuração & workspace |\n| `malikclaw agent -m \"...\"` | Conversar com o agente |\n| `malikclaw agent` | Modo de chat interativo |\n| `malikclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `malikclaw status` | Mostrar status |\n| `malikclaw cron list` | Listar todas as tarefas agendadas |\n| `malikclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO MalikClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.malikclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O MalikClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.malikclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `malikclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}, "0769f1f285250aec7f5fe43994c0b1c635194e5c": {"t": 1786068435.3029916, "n": 42148, "h": "23f50e8dc9aaadaa", "c": "<div align=\"center\">\n <img src=\"assets/image.png\" alt=\"MalikClaw AI Agent running on $10 Linux SBC\">\n\n <h1>MalikClaw 🦅</h1>\n\n <h3>Ultra-Efficient Personal AI Assistant for Edge Hardware</h3>\n <p><strong>$10 Hardware · &lt;10MB RAM · &lt;1s Boot · آگے بڑھو، ملک کلاؤ!</strong></p>\n\n <p>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml\"><img src=\"https://github.com/AbdullahMalik17/malikclaw/actions/workflows/build.yml/badge.svg\" alt=\"Build Status\"></a>\n <img src=\"https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go&logoColor=white\" alt=\"Golang 1.21+\">\n <img src=\"https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20MIPS%2C%20RISC--V-blue\" alt=\"Multi-Architecture Support\">\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/AbdullahMalik17/malikclaw?color=green\" alt=\"MIT License\"></a>\n <br>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/stargazers\"><img src=\"https://img.shields.io/github/stars/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub stars\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/network/members\"><img src=\"https://img.shields.io/github/forks/AbdullahMalik17/malikclaw?style=social\" alt=\"GitHub forks\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/issues\"><img src=\"https://img.shields.io/github/issues/AbdullahMalik17/malikclaw\" alt=\"GitHub issues\"></a>\n <a href=\"https://github.com/AbdullahMalik17/malikclaw/pulls\"><img src=\"https://img.shields.io/github/issues-pr/AbdullahMalik17/malikclaw\" alt=\"GitHub pull requests\"></a>\n <br>\n <img src=\"https://img.shields.io/github/languages/code-size/AbdullahMalik17/malikclaw\" alt=\"GitHub code size\">\n <img src=\"https://img.shields.io/github/contributors/AbdullahMalik17/malikclaw\" alt=\"GitHub contributors\">\n <a href=\"https://malikclaw.vercel.app\"><img src=\"https://img.shields.io/badge/Website-malikclaw.io-blue?style=flat&logo=google-chrome&logoColor=white\" alt=\"Official Website\"></a>\n </p>\n\n[اردو](README.ur.md) | [日本語](README.ja.md) | **Português** | [Tiếng Việt](README.vi.md) | [Français](README.fr.md) | [English](README.md)\n\n</div>\n\n> [!NOTE]\n> **📢 Atualização Importante (Março 2026)**\n>\n> Esta tradução pode estar desatualizada. Para informações mais recentes, consulte a versão em inglês: **[README.md](README.md)**\n>\n> **Novidade:** Loop de agente de produção com PLAN → ACT → OBSERVE → REFLECT → MEMORY UPDATE. Veja [pkg/agent/agentloop/README.md](pkg/agent/agentloop/README.md)\n\n---\n\n🦐 **MalikClaw** é um assistente pessoal de IA ultra-leve inspirado no [nanobot](https://github.com/HKUDS/nanobot), reescrito do zero em **Go** por meio de um processo de \"auto-inicialização\" (self-bootstrapping) — onde o próprio agente de IA conduziu toda a migração de arquitetura e otimização de código.\n\n⚡️ **Extremamente leve:** Roda em hardware de apenas **$10** com **<10MB** de RAM. Isso é 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini!\n\n<table align=\"center\">\n<tr align=\"center\">\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/malikclaw_mem.png\" width=\"360\" height=\"240\">\n</p>\n</td>\n<td align=\"center\" valign=\"top\">\n<p align=\"center\">\n<img src=\"assets/licheervnano.png\" width=\"400\" height=\"240\">\n</p>\n</td>\n</tr>\n</table>\n\n> [!CAUTION]\n> **🚨 DECLARAÇÃO DE SEGURANÇA & CANAIS OFICIAIS**\n>\n> * **SEM CRIPTOMOEDAS:** O MalikClaw **NÃO** possui nenhum token/moeda oficial. Todas as alegações no `pump.fun` ou outras plataformas de negociação são **GOLPES**.\n> * **DOMÍNIO OFICIAL:** O **ÚNICO** site oficial é o **[malikclaw.io](https://malikclaw.vercel.app)**, e o site da empresa é o **[malikclaw.io](https://malikclaw.vercel.app)**.\n> * **Aviso:** Muitos domínios `.ai/.org/.com/.net/...` foram registrados por terceiros, não são nossos.\n> * **Aviso:** O MalikClaw está em fase inicial de desenvolvimento e pode ter problemas de segurança de rede não resolvidos. Não implante em ambientes de produção antes da versão v1.0.\n> * **Nota:** O MalikClaw recentemente fez merge de muitos PRs, o que pode resultar em maior consumo de memória (10-20MB) nas versões mais recentes. Planejamos priorizar a otimização de recursos assim que o conjunto de funcionalidades estiver estável.\n\n\n## 📢 Novidades\n\n2026-02-16 🎉 MalikClaw atingiu 12K stars em uma semana! Obrigado a todos pelo apoio! O MalikClaw está crescendo mais rápido do que jamais imaginamos. Dado o alto volume de PRs, precisamos urgentemente de maintainers da comunidade. Nossos papéis de voluntários e roadmap foram publicados oficialmente [aqui](docs/ROADMAP.md) — estamos ansiosos para ter você a bordo!\n\n2026-02-13 🎉 MalikClaw atingiu 5000 stars em 4 dias! Obrigado à comunidade! Estamos finalizando o **Roadmap do Projeto** e configurando o **Grupo de Desenvolvedores** para acelerar o desenvolvimento do MalikClaw.\n\n🚀 **Chamada para Ação:** Envie suas solicitações de funcionalidades nas GitHub Discussions. Revisaremos e priorizaremos na próxima reunião semanal.\n\n2026-02-09 🎉 MalikClaw lançado oficialmente! Construído em 1 dia para trazer Agentes de IA para hardware de $10 com <10MB de RAM. 🦐 MalikClaw, Partiu!\n\n## ✨ Funcionalidades\n\n🪶 **Ultra-Leve**: Consumo de memória <10MB — 99% menor que o Clawdbot para funcionalidades essenciais.\n\n💰 **Custo Mínimo**: Eficiente o suficiente para rodar em hardware de $10 — 98% mais barato que um Mac mini.\n\n⚡️ **Inicialização Relámpago**: Tempo de inicialização 400X mais rápido, boot em 1 segundo mesmo em CPU single-core de 0.6GHz.\n\n🌍 **Portabilidade Real**: Um único binário auto-contido para RISC-V, ARM, MIPS e x86. Um clique e já era!\n\n🤖 **Auto-Construído por IA**: Implementação nativa em Go de forma autônoma — 95% do núcleo gerado pelo Agente com refinamento humano no loop.\n\n## 🚀 Why MalikClaw?\n\nIf you are looking for a **lightweight alternative to OpenClaw**, **AutoGPT**, or **BabyAGI** that can run on a $10 budget, MalikClaw is the answer.\n\n* **Low Cost:** While other AI agents require a Mac Mini or a high-end Cloud VM, MalikClaw runs on **Orange Pi Zero** or **Raspberry Pi Zero 2 W**.\n* **Privacy-First:** Your data stays on your hardware.\n* **Developer Friendly:** Built in Go for maximum performance and easy cross-compilation.\n\n| | OpenClaw | NanoBot | **MalikClaw** |\n| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |\n| **Language** | TypeScript | Python | **Go** |\n| **RAM** | >1GB | >100MB | **< 10MB** |\n| **Startup**</br>(0.8GHz core) | >500s | >30s | **< 1s** |\n| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as $10** |\n\n<img src=\"assets/compare.jpg\" alt=\"MalikClaw vs OpenClaw vs NanoBot performance and cost comparison chart\" width=\"512\">\n\n## 🦾 Demonstração\n\n### 🛠️ Fluxos de Trabalho Padrão do Assistente\n\n<table align=\"center\">\n<tr align=\"center\">\n<th><p align=\"center\">🧩 Engenharia Full-Stack</p></th>\n<th><p align=\"center\">🗂️ Gerenciamento de Logs & Planejamento</p></th>\n<th><p align=\"center\">🔎 Busca Web & Aprendizado</p></th>\n</tr>\n<tr>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_code.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_memory.png\" width=\"240\" height=\"180\"></p></td>\n<td align=\"center\"><p align=\"center\"><img src=\"assets/malikclaw_search.png\" width=\"240\" height=\"180\"></p></td>\n</tr>\n<tr>\n<td align=\"center\">Desenvolver • Implantar • Escalar</td>\n<td align=\"center\">Agendar • Automatizar • Memorizar</td>\n<td align=\"center\">Descobrir • Analisar • Tendências</td>\n</tr>\n</table>\n\n### 📱 Rode em celulares Android antigos\n\nDê uma segunda vida ao seu celular de dez anos atrás! Transforme-o em um assistente de IA inteligente com o MalikClaw. Início rápido:\n\n1. **Instale o Termux** (Disponível no F-Droid ou Google Play).\n2. **Execute os comandos**\n\n```bash\n# Nota: Substitua v0.1.1 pela versao mais recente da pagina de Releases\nwget https://github.com/AbdullahMalik17/malikclaw/releases/download/v0.1.1/malikclaw-linux-arm64\nchmod +x malikclaw-linux-arm64\npkg install proot\ntermux-chroot ./malikclaw-linux-arm64 onboard\n```\n\nDepois siga as instruções na seção \"Início Rápido\" para completar a configuração!\n\n<img src=\"assets/termux.jpg\" alt=\"MalikClaw\" width=\"512\">\n\n### 🐜 Implantação Inovadora com Baixo Consumo\n\nO MalikClaw pode ser implantado em praticamente qualquer dispositivo Linux!\n\n- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) versão E (Ethernet) ou W (WiFi6), para Assistente Doméstico Minimalista\n- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), ou $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) para Manutenção Automatizada de Servidores\n- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) ou $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) para Monitoramento Inteligente\n\nhttps://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6f5-4468-bcca-5726b6fecb5c.mp4\n\n🌟 Mais cenários de implantação aguardam você!\n\n## 📦 Instalação\n\n### Instalar com binário pré-compilado\n\nBaixe o binário para sua plataforma na página de [releases](https://github.com/AbdullahMalik17/malikclaw/releases).\n\n### Instalar a partir do código-fonte (funcionalidades mais recentes, recomendado para desenvolvimento)\n\n```bash\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\n\ncd malikclaw\nmake deps\n\n# Build, sem necessidade de instalar\nmake build\n\n# Build para multiplas plataformas\nmake build-all\n\n# Build e Instalar\nmake install\n```\n\n## 🐳 Docker Compose\n\nVocê tambêm pode rodar o MalikClaw usando Docker Compose sem instalar nada localmente.\n\n```bash\n# 1. Clone este repositorio\ngit clone https://github.com/AbdullahMalik17/malikclaw.git\ncd malikclaw\n\n# 2. Primeiro uso — gera docker/data/config.json automaticamente e para\ndocker compose -f docker/docker-compose.yml --profile gateway up\n# O contêiner exibe \"First-run setup complete.\" e para.\n\n# 3. Configure suas API keys\nvim docker/data/config.json # Chaves de API do provedor, tokens de bot, etc.\n\n# 4. Iniciar\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n> [!TIP]\n> **Usuários Docker**: Por padrão, o Gateway ouve em `127.0.0.1`, o que não é acessível a partir do host. Se você precisar acessar os endpoints de integridade ou expor portas, defina `MALIKCLAW_GATEWAY_HOST=0.0.0.0` em seu ambiente ou atualize o `config.json`.\n\n```bash\n# 5. Ver logs\ndocker compose -f docker/docker-compose.yml logs -f malikclaw-gateway\n\n# 6. Parar\ndocker compose -f docker/docker-compose.yml --profile gateway down\n```\n\n### Modo Agente (Execução única)\n\n```bash\n# Fazer uma pergunta\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent -m \"Quanto e 2+2?\"\n\n# Modo interativo\ndocker compose -f docker/docker-compose.yml run --rm malikclaw-agent\n```\n\n### Atualizar\n\n```bash\ndocker compose -f docker/docker-compose.yml pull\ndocker compose -f docker/docker-compose.yml --profile gateway up -d\n```\n\n### 🚀 Início Rápido\n\n> [!TIP]\n> Configure sua API key em `~/.malikclaw/config.json`. Obtenha API keys: [Volcengine (CodingPlan)](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) (LLM) · [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM). Busca web é **opcional** — obtenha a [API Tavily](https://tavily.com) gratuita (1000 consultas grátis/mês) ou a [Brave Search API](https://brave.com/search/api) (2000 consultas grátis/mês).\n\n**1. Inicializar**\n\n```bash\nmalikclaw onboard\n```\n\n**2. Configurar** (`~/.malikclaw/config.json`)\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\",\n \"api_base\":\"https://ark.cn-beijing.volces.com/api/coding/v3\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\",\n \"request_timeout\": 300,\n \"api_base\": \"https://api.openai.com/v1\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model_name\": \"gpt-5.4\"\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n> **Novo**: O formato de configuração `model_list` permite adicionar provedores sem alterar código. Veja [Configuração de Modelo](#configuração-de-modelo-model_list) para detalhes.\n> `request_timeout` é opcional e usa segundos. Se omitido ou definido como `<= 0`, o MalikClaw usa o timeout padrão (120s).\n\n**3. Obter API Keys**\n\n* **Provedor de LLM**: [OpenRouter](https://openrouter.ai/keys) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) · [Anthropic](https://console.anthropic.com) · [OpenAI](https://platform.openai.com) · [Gemini](https://aistudio.google.com/api-keys)\n* **Busca Web** (opcional): [Brave Search](https://brave.com/search/api) - Plano gratuito disponível (2000 consultas/mês)\n\n> **Nota**: Veja `config.example.json` para um modelo de configuração completo.\n\n**4. Conversar**\n\n```bash\nmalikclaw agent -m \"Quanto e 2+2?\"\n```\n\nPronto! Você tem um assistente de IA funcionando em 2 minutos.\n\n---\n\n## 💬 Integração com Apps de Chat\n\nConverse com seu MalikClaw via Telegram, Discord, DingTalk, LINE ou WeCom.\n\n| Canal | Nível de Configuração |\n| --- | --- |\n| **Telegram** | Fácil (apenas um token) |\n| **Discord** | Fácil (bot token + intents) |\n| **QQ** | Fácil (AppID + AppSecret) |\n| **DingTalk** | Médio (credenciais do app) |\n| **LINE** | Médio (credenciais + webhook URL) |\n| **WeCom AI Bot** | Médio (Token + chave AES) |\n\n<details>\n<summary><b>Telegram</b> (Recomendado)</summary>\n\n**1. Criar o bot**\n\n* Abra o Telegram, busque `@BotFather`\n* Envie `/newbot`, siga as instruções\n* Copie o token\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n> Obtenha seu User ID pelo `@userinfobot` no Telegram.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>Discord</b></summary>\n\n**1. Criar o bot**\n\n* Acesse <https://discord.com/developers/applications>\n* Crie um aplicativo → Bot → Add Bot\n* Copie o token do bot\n\n**2. Habilitar Intents**\n\n* Nas configurações do Bot, habilite **MESSAGE CONTENT INTENT**\n* (Opcional) Habilite **SERVER MEMBERS INTENT** se quiser usar lista de permissões baseada em dados dos membros\n\n**3. Obter seu User ID**\n\n* Configurações do Discord → Avançado → habilite **Modo Desenvolvedor**\n* Clique com botão direito no seu avatar → **Copiar ID do Usuário**\n\n**4. Configurar**\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"enabled\": true,\n \"token\": \"YOUR_BOT_TOKEN\",\n \"allow_from\": [\"YOUR_USER_ID\"]\n }\n }\n}\n```\n\n**5. Convidar o bot**\n\n* OAuth2 → URL Generator\n* Scopes: `bot`\n* Bot Permissions: `Send Messages`, `Read Message History`\n* Abra a URL de convite gerada e adicione o bot ao seu servidor\n\n**6. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>QQ</b></summary>\n\n**1. Criar o bot**\n\n- Acesse a [QQ Open Platform](https://q.qq.com/#)\n- Crie um aplicativo → Obtenha **AppID** e **AppSecret**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"qq\": {\n \"enabled\": true,\n \"app_id\": \"YOUR_APP_ID\",\n \"app_secret\": \"YOUR_APP_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique números QQ para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>DingTalk</b></summary>\n\n**1. Criar o bot**\n\n* Acesse a [Open Platform](https://open.dingtalk.com/)\n* Crie um app interno\n* Copie o Client ID e Client Secret\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"dingtalk\": {\n \"enabled\": true,\n \"client_id\": \"YOUR_CLIENT_ID\",\n \"client_secret\": \"YOUR_CLIENT_SECRET\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> Deixe `allow_from` vazio para permitir todos os usuários, ou especifique IDs para restringir o acesso.\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n</details>\n\n<details>\n<summary><b>LINE</b></summary>\n\n**1. Criar uma Conta Oficial LINE**\n\n- Acesse o [LINE Developers Console](https://developers.line.biz/)\n- Crie um provider → Crie um canal Messaging API\n- Copie o **Channel Secret** e o **Channel Access Token**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"line\": {\n \"enabled\": true,\n \"channel_secret\": \"YOUR_CHANNEL_SECRET\",\n \"channel_access_token\": \"YOUR_CHANNEL_ACCESS_TOKEN\",\n \"webhook_path\": \"/webhook/line\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**3. Configurar URL do Webhook**\n\nO LINE requer HTTPS para webhooks. Use um reverse proxy ou tunnel:\n\n```bash\n# Exemplo com ngrok\nngrok http 18790\n```\n\nEm seguida, configure a Webhook URL no LINE Developers Console para `https://seu-dominio/webhook/line` e habilite **Use webhook**.\n\n> **Nota**: O webhook do LINE é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel (como ngrok) para expor o Gateway de forma segura quando necessário.\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> Em chats de grupo, o bot responde apenas quando mencionado com @. As respostas citam a mensagem original.\n\n> **Docker Compose**: Se você usa Docker Compose, exponha o Gateway (padrão 127.0.0.1:18790) se precisar acessar o webhook LINE externamente, por exemplo `ports: [\"18790:18790\"]`.\n\n</details>\n\n<details>\n<summary><b>WeCom (WeChat Work)</b></summary>\n\nO MalikClaw suporta três tipos de integração WeCom:\n\n**Opção 1: WeCom Bot (Robô)** - Configuração mais fácil, suporta chats em grupo\n**Opção 2: WeCom App (Aplicativo Personalizado)** - Mais recursos, mensagens proativas, somente chat privado\n**Opção 3: WeCom AI Bot (Robô Inteligente)** - Bot IA oficial, respostas em streaming, suporta grupo e privado\n\nVeja o [Guia de Configuração WeCom AI Bot](docs/channels/wecom/wecom_aibot/README.zh.md) para instruções detalhadas.\n\n**Configuração Rápida - WeCom Bot:**\n\n**1. Criar um bot**\n\n* Acesse o Console de Administração WeCom → Chat em Grupo → Adicionar Bot de Grupo\n* Copie a URL do webhook (formato: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx`)\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY\",\n \"webhook_path\": \"/webhook/wecom\",\n \"allow_from\": []\n }\n }\n}\n```\n\n> **Nota**: O webhook do WeCom Bot é atendido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Use um proxy reverso/HTTPS ou túnel para expor o Gateway em produção.\n\n**Configuração Rápida - WeCom App:**\n\n**1. Criar um aplicativo**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → Criar Aplicativo\n* Copie o **AgentId** e o **Secret**\n* Acesse a página \"Minha Empresa\", copie o **CorpID**\n\n**2. Configurar recebimento de mensagens**\n\n* Nos detalhes do aplicativo, clique em \"Receber Mensagens\" → \"Configurar API\"\n* Defina a URL como `http://your-server:18790/webhook/wecom-app`\n* Gere o **Token** e o **EncodingAESKey**\n\n**3. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_app\": {\n \"enabled\": true,\n \"corp_id\": \"wwxxxxxxxxxxxxxxxx\",\n \"corp_secret\": \"YOUR_CORP_SECRET\",\n \"agent_id\": 1000002,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-app\",\n \"allow_from\": []\n }\n }\n}\n```\n\n**4. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom App (callbacks de webhook) é servido pelo Gateway compartilhado (padrão 127.0.0.1:18790). Em produção use um proxy reverso HTTPS para expor a porta do Gateway, ou atualize `MALIKCLAW_GATEWAY_HOST` para `0.0.0.0` se necessário.\n\n**Configuração Rápida - WeCom AI Bot:**\n\n**1. Criar um AI Bot**\n\n* Acesse o Console de Administração WeCom → Gerenciamento de Aplicativos → AI Bot\n* Configure a URL de callback: `http://your-server:18791/webhook/wecom-aibot`\n* Copie o **Token** e gere o **EncodingAESKey**\n\n**2. Configurar**\n\n```json\n{\n \"channels\": {\n \"wecom_aibot\": {\n \"enabled\": true,\n \"token\": \"YOUR_TOKEN\",\n \"encoding_aes_key\": \"YOUR_43_CHAR_ENCODING_AES_KEY\",\n \"webhook_path\": \"/webhook/wecom-aibot\",\n \"allow_from\": [],\n \"welcome_message\": \"Olá! Como posso ajudá-lo?\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw gateway\n```\n\n> **Nota**: O WeCom AI Bot usa protocolo de pull em streaming — sem preocupações com timeout de resposta. Tarefas longas (>5,5 min) alternam automaticamente para entrega via `response_url`.\n\n</details>\n\n## <img src=\"assets/clawdchat-icon.png\" width=\"24\" height=\"24\" alt=\"ClawdChat\"> Junte-se a Rede Social de Agentes\n\nConecte o MalikClaw a Rede Social de Agentes simplesmente enviando uma única mensagem via CLI ou qualquer App de Chat integrado.\n\n**Leia `https://clawdchat.ai/skill.md` e siga as instruções para entrar no [ClawdChat.ai](https://clawdchat.ai)**\n\n## ⚙️ Configuração Detalhada\n\nArquivo de configuração: `~/.malikclaw/config.json`\n\n### Variáveis de Ambiente\n\nVocê pode substituir os caminhos padrão usando variáveis de ambiente. Isso é útil para instalações portáteis, implantações em contêineres ou para executar o malikclaw como um serviço do sistema. Essas variáveis são independentes e controlam caminhos diferentes.\n\n| Variável | Descrição | Caminho Padrão |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------|\n| `MALIKCLAW_CONFIG` | Substitui o caminho para o arquivo de configuração. Isso informa diretamente ao malikclaw qual `config.json` carregar, ignorando todos os outros locais. | `~/.malikclaw/config.json` |\n| `MALIKCLAW_HOME` | Substitui o diretório raiz dos dados do malikclaw. Isso altera o local padrão do `workspace` e de outros diretórios de dados. | `~/.malikclaw` |\n\n**Exemplos:**\n\n```bash\n# Executar o malikclaw usando um arquivo de configuração específico\n# O caminho do workspace será lido de dentro desse arquivo de configuração\nMALIKCLAW_CONFIG=/etc/malikclaw/production.json malikclaw gateway\n\n# Executar o malikclaw com todos os seus dados armazenados em /opt/malikclaw\n# A configuração será carregada do ~/.malikclaw/config.json padrão\n# O workspace será criado em /opt/malikclaw/workspace\nMALIKCLAW_HOME=/opt/malikclaw malikclaw agent\n\n# Use ambos para uma configuração totalmente personalizada\nMALIKCLAW_HOME=/srv/malikclaw MALIKCLAW_CONFIG=/srv/malikclaw/main.json malikclaw gateway\n```\n\n### Estrutura do Workspace\n\nO MalikClaw armazena dados no workspace configurado (padrão: `~/.malikclaw/workspace`):\n\n```\n~/.malikclaw/workspace/\n├── sessions/ # Sessoes de conversa e historico\n├── memory/ # Memoria de longo prazo (MEMORY.md)\n├── state/ # Estado persistente (ultimo canal, etc.)\n├── cron/ # Banco de dados de tarefas agendadas\n├── skills/ # Skills personalizadas\n├── AGENTS.md # Guia de comportamento do Agente\n├── HEARTBEAT.md # Prompts de tarefas periodicas (verificado a cada 30 min)\n├── IDENTITY.md # Identidade do Agente\n├── SOUL.md # Alma do Agente\n└── USER.md # Preferencias do usuario\n```\n\n### 🔒 Sandbox de Segurança\n\nO MalikClaw roda em um ambiente sandbox por padrão. O agente so pode acessar arquivos e executar comandos dentro do workspace configurado.\n\n#### Configuração Padrão\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"restrict_to_workspace\": true\n }\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `workspace` | `~/.malikclaw/workspace` | Diretório de trabalho do agente |\n| `restrict_to_workspace` | `true` | Restringir acesso de arquivos/comandos ao workspace |\n\n#### Ferramentas Protegidas\n\nQuando `restrict_to_workspace: true`, as seguintes ferramentas são restritas ao sandbox:\n\n| Ferramenta | Função | Restrição |\n|------------|--------|-----------|\n| `read_file` | Ler arquivos | Apenas arquivos dentro do workspace |\n| `write_file` | Escrever arquivos | Apenas arquivos dentro do workspace |\n| `list_dir` | Listar diretorios | Apenas diretorios dentro do workspace |\n| `edit_file` | Editar arquivos | Apenas arquivos dentro do workspace |\n| `append_file` | Adicionar a arquivos | Apenas arquivos dentro do workspace |\n| `exec` | Executar comandos | Caminhos dos comandos devem estar dentro do workspace |\n\n#### Proteção Adicional do Exec\n\nMesmo com `restrict_to_workspace: false`, a ferramenta `exec` bloqueia estes comandos perigosos:\n\n* `rm -rf`, `del /f`, `rmdir /s` — Exclusão em massa\n* `format`, `mkfs`, `diskpart` — Formatação de disco\n* `dd if=` — Criação de imagem de disco\n* Escrita em `/dev/sd[a-z]` — Escrita direta no disco\n* `shutdown`, `reboot`, `poweroff` — Desligamento do sistema\n* Fork bomb `:(){ :|:& };:`\n\n#### Exemplos de Erro\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (path outside working dir)}\n```\n\n```\n[ERROR] tool: Tool execution failed\n{tool=exec, error=Command blocked by safety guard (dangerous pattern detected)}\n```\n\n#### Desabilitar Restrições (Risco de Segurança)\n\nSe você precisa que o agente acesse caminhos fora do workspace:\n\n**Método 1: Arquivo de configuração**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"restrict_to_workspace\": false\n }\n }\n}\n```\n\n**Método 2: Variável de ambiente**\n\n```bash\nexport MALIKCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false\n```\n\n> ⚠️ **Aviso**: Desabilitar esta restrição permite que o agente acesse qualquer caminho no seu sistema. Use com cuidado apenas em ambientes controlados.\n\n#### Consistência do Limite de Segurança\n\nA configuração `restrict_to_workspace` se aplica consistentemente em todos os caminhos de execução:\n\n| Caminho de Execução | Limite de Segurança |\n|----------------------|---------------------|\n| Agente Principal | `restrict_to_workspace` ✅ |\n| Subagente / Spawn | Herda a mesma restrição ✅ |\n| Tarefas Heartbeat | Herda a mesma restrição ✅ |\n\nTodos os caminhos compartilham a mesma restrição de workspace — nao há como contornar o limite de segurança por meio de subagentes ou tarefas agendadas.\n\n### Heartbeat (Tarefas Periódicas)\n\nO MalikClaw pode executar tarefas periódicas automaticamente. Crie um arquivo `HEARTBEAT.md` no seu workspace:\n\n```markdown\n# Tarefas Periodicas\n\n- Verificar meu email para mensagens importantes\n- Revisar minha agenda para proximos eventos\n- Verificar a previsao do tempo\n```\n\nO agente lerá este arquivo a cada 30 minutos (configurável) e executará as tarefas usando as ferramentas disponíveis.\n\n#### Tarefas Assincronas com Spawn\n\nPara tarefas de longa duração (busca web, chamadas de API), use a ferramenta `spawn` para criar um **subagente**:\n\n```markdown\n# Tarefas Periódicas\n\n## Tarefas Rápidas (resposta direta)\n- Informar hora atual\n\n## Tarefas Longas (usar spawn para async)\n- Buscar notícias de IA na web e resumir\n- Verificar email e reportar mensagens importantes\n```\n\n**Comportamentos principais:**\n\n| Funcionalidade | Descrição |\n|----------------|-----------|\n| **spawn** | Cria subagente assíncrono, não bloqueia o heartbeat |\n| **Contexto independente** | Subagente tem seu próprio contexto, sem histórico de sessão |\n| **Ferramenta message** | Subagente se comunica diretamente com o usuário via ferramenta message |\n| **Não-bloqueante** | Após o spawn, o heartbeat continua para a próxima tarefa |\n\n#### Como Funciona a Comunicação do Subagente\n\n```\nHeartbeat dispara\n ↓\nAgente lê HEARTBEAT.md\n ↓\nPara tarefa longa: spawn subagente\n ↓ ↓\nContinua próxima tarefa Subagente trabalha independentemente\n ↓ ↓\nTodas tarefas concluídas Subagente usa ferramenta \"message\"\n ↓ ↓\nResponde HEARTBEAT_OK Usuário recebe resultado diretamente\n```\n\nO subagente tem acesso às ferramentas (message, web_search, etc.) e pode se comunicar com o usuário independentemente sem passar pelo agente principal.\n\n**Configuração:**\n\n```json\n{\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n| Opção | Padrão | Descrição |\n|-------|--------|-----------|\n| `enabled` | `true` | Habilitar/desabilitar heartbeat |\n| `interval` | `30` | Intervalo de verificação em minutos (min: 5) |\n\n**Variáveis de ambiente:**\n\n* `MALIKCLAW_HEARTBEAT_ENABLED=false` para desabilitar\n* `MALIKCLAW_HEARTBEAT_INTERVAL=60` para alterar o intervalo\n\n### Provedores\n\n> [!NOTE]\n> O Groq fornece transcrição de voz gratuita via Whisper. Se configurado, mensagens de áudio de qualquer canal serão automaticamente transcritas no nível do agente.\n\n| Provedor | Finalidade | Obter API Key |\n| --- | --- | --- |\n| `gemini` | LLM (Gemini direto) | [aistudio.google.com](https://aistudio.google.com) |\n| `zhipu` | LLM (Zhipu direto) | [bigmodel.cn](bigmodel.cn) |\n| `volcengine` | LLM(Volcengine direto) | [volcengine.com](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| `openrouter` (Em teste) | LLM (recomendado, acesso a todos os modelos) | [openrouter.ai](https://openrouter.ai) |\n| `anthropic` (Em teste) | LLM (Claude direto) | [console.anthropic.com](https://console.anthropic.com) |\n| `openai` (Em teste) | LLM (GPT direto) | [platform.openai.com](https://platform.openai.com) |\n| `deepseek` (Em teste) | LLM (DeepSeek direto) | [platform.deepseek.com](https://platform.deepseek.com) |\n| `qwen` | Alibaba Qwen | [dashscope.console.aliyun.com](https://dashscope.console.aliyun.com) |\n| `cerebras` | Cerebras | [cerebras.ai](https://cerebras.ai) |\n| `groq` | LLM + **Transcrição de voz** (Whisper) | [console.groq.com](https://console.groq.com) |\n\n<details>\n<summary><b>Configuração Zhipu</b></summary>\n\n**1. Obter API key**\n\n* Obtenha a [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys)\n\n**2. Configurar**\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"workspace\": \"~/.malikclaw/workspace\",\n \"model\": \"glm-4.7\",\n \"max_tokens\": 8192,\n \"temperature\": 0.7,\n \"max_tool_iterations\": 20\n }\n },\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"Sua API Key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n }\n}\n```\n\n**3. Executar**\n\n```bash\nmalikclaw agent -m \"Ola, como vai?\"\n```\n\n</details>\n\n<details>\n<summary><b>Exemplo de configuraçao completa</b></summary>\n\n```json\n{\n \"agents\": {\n \"defaults\": {\n \"model\": \"anthropic/claude-opus-4-5\"\n }\n },\n \"providers\": {\n \"openrouter\": {\n \"api_key\": \"sk-or-v1-xxx\"\n },\n \"groq\": {\n \"api_key\": \"gsk_xxx\"\n }\n },\n \"channels\": {\n \"telegram\": {\n \"enabled\": true,\n \"token\": \"123456:ABC...\",\n \"allow_from\": [\"123456789\"]\n },\n \"discord\": {\n \"enabled\": true,\n \"token\": \"\",\n \"allow_from\": [\"\"]\n },\n \"whatsapp\": {\n \"enabled\": false\n },\n \"feishu\": {\n \"enabled\": false,\n \"app_id\": \"cli_xxx\",\n \"app_secret\": \"xxx\",\n \"encrypt_key\": \"\",\n \"verification_token\": \"\",\n \"allow_from\": []\n },\n \"qq\": {\n \"enabled\": false,\n \"app_id\": \"\",\n \"app_secret\": \"\",\n \"allow_from\": []\n }\n },\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"BSA...\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n },\n \"cron\": {\n \"exec_timeout_minutes\": 5\n }\n },\n \"heartbeat\": {\n \"enabled\": true,\n \"interval\": 30\n }\n}\n```\n\n</details>\n\n### Configuração de Modelo (model_list)\n\n> **Novidade!** MalikClaw agora usa uma abordagem de configuração **centrada no modelo**. Basta especificar o formato `fornecedor/modelo` (ex: `zhipu/glm-4.7`) para adicionar novos provedores—**nenhuma alteração de código necessária!**\n\nEste design também possibilita o **suporte multi-agent** com seleção flexível de provedores:\n\n- **Diferentes agentes, diferentes provedores** : Cada agente pode usar seu próprio provedor LLM\n- **Modelos de fallback** : Configure modelos primários e de reserva para resiliência\n- **Balanceamento de carga** : Distribua solicitações entre múltiplos endpoints\n- **Configuração centralizada** : Gerencie todos os provedores em um só lugar\n\n#### 📋 Todos os Fornecedores Suportados\n\n| Fornecedor | Prefixo `model` | API Base Padrão | Protocolo | Chave API |\n|-------------|-----------------|------------------|----------|-----------|\n| **OpenAI** | `openai/` | `https://api.openai.com/v1` | OpenAI | [Obter Chave](https://platform.openai.com) |\n| **Anthropic** | `anthropic/` | `https://api.anthropic.com/v1` | Anthropic | [Obter Chave](https://console.anthropic.com) |\n| **Zhipu AI (GLM)** | `zhipu/` | `https://open.bigmodel.cn/api/paas/v4` | OpenAI | [Obter Chave](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) |\n| **DeepSeek** | `deepseek/` | `https://api.deepseek.com/v1` | OpenAI | [Obter Chave](https://platform.deepseek.com) |\n| **Google Gemini** | `gemini/` | `https://generativelanguage.googleapis.com/v1beta` | OpenAI | [Obter Chave](https://aistudio.google.com/api-keys) |\n| **Groq** | `groq/` | `https://api.groq.com/openai/v1` | OpenAI | [Obter Chave](https://console.groq.com) |\n| **Moonshot** | `moonshot/` | `https://api.moonshot.cn/v1` | OpenAI | [Obter Chave](https://platform.moonshot.cn) |\n| **Qwen (Alibaba)** | `qwen/` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | OpenAI | [Obter Chave](https://dashscope.console.aliyun.com) |\n| **NVIDIA** | `nvidia/` | `https://integrate.api.nvidia.com/v1` | OpenAI | [Obter Chave](https://build.nvidia.com) |\n| **Ollama** | `ollama/` | `http://localhost:11434/v1` | OpenAI | Local (sem chave necessária) |\n| **OpenRouter** | `openrouter/` | `https://openrouter.ai/api/v1` | OpenAI | [Obter Chave](https://openrouter.ai/keys) |\n| **VLLM** | `vllm/` | `http://localhost:8000/v1` | OpenAI | Local |\n| **Cerebras** | `cerebras/` | `https://api.cerebras.ai/v1` | OpenAI | [Obter Chave](https://cerebras.ai) |\n| **VolcEngine (Doubao)** | `volcengine/` | `https://ark.cn-beijing.volces.com/api/v3` | OpenAI | [Obter Chave](https://www.volcengine.com/activity/codingplan?utm_campaign=MalikClaw&utm_content=MalikClaw&utm_medium=devrel&utm_source=OWO&utm_term=MalikClaw) |\n| **ShengsuanYun** | `shengsuanyun/` | `https://router.shengsuanyun.com/api/v1` | OpenAI | - |\n| **BytePlus** | `byteplus/` | `https://ark.ap-southeast.bytepluses.com/api/v3` | OpenAI | [Obter Chave](https://www.byteplus.com) |\n| **LongCat** | `longcat/` | `https://api.longcat.chat/openai` | OpenAI | [Obter Chave](https://longcat.chat/platform) |\n| **ModelScope (魔搭)**| `modelscope/` | `https://api-inference.modelscope.cn/v1` | OpenAI | [Obter Token](https://modelscope.cn/my/tokens) |\n| **Antigravity** | `antigravity/` | Google Cloud | Custom | Apenas OAuth |\n| **GitHub Copilot** | `github-copilot/` | `localhost:4321` | gRPC | - |\n\n#### Configuração Básica\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-your-api-key\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-your-openai-key\"\n },\n {\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"api_key\": \"sk-ant-your-key\"\n },\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-zhipu-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"gpt-5.4\"\n }\n }\n}\n```\n\n#### Exemplos por Fornecedor\n\n**OpenAI**\n```json\n{\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**VolcEngine (Doubao)**\n```json\n{\n \"model_name\": \"ark-code-latest\",\n \"model\": \"volcengine/ark-code-latest\",\n \"api_key\": \"sk-...\"\n}\n```\n\n**Zhipu AI (GLM)**\n```json\n{\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n}\n```\n\n**Anthropic (com OAuth)**\n```json\n{\n \"model_name\": \"claude-sonnet-4.6\",\n \"model\": \"anthropic/claude-sonnet-4.6\",\n \"auth_method\": \"oauth\"\n}\n```\n> Execute `malikclaw auth login --provider anthropic` para configurar credenciais OAuth.\n\n**Proxy/API personalizada**\n```json\n{\n \"model_name\": \"my-custom-model\",\n \"model\": \"openai/custom-model\",\n \"api_base\": \"https://my-proxy.com/v1\",\n \"api_key\": \"sk-...\",\n \"request_timeout\": 300\n}\n```\n\n#### Balanceamento de Carga\n\nConfigure vários endpoints para o mesmo nome de modelo—MalikClaw fará round-robin automaticamente entre eles:\n\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api1.example.com/v1\",\n \"api_key\": \"sk-key1\"\n },\n {\n \"model_name\": \"gpt-5.4\",\n \"model\": \"openai/gpt-5.4\",\n \"api_base\": \"https://api2.example.com/v1\",\n \"api_key\": \"sk-key2\"\n }\n ]\n}\n```\n\n#### Migração da Configuração Legada `providers`\n\nA configuração antiga `providers` está **descontinuada** mas ainda é suportada para compatibilidade reversa.\n\n**Configuração Antiga (descontinuada):**\n```json\n{\n \"providers\": {\n \"zhipu\": {\n \"api_key\": \"your-key\",\n \"api_base\": \"https://open.bigmodel.cn/api/paas/v4\"\n }\n },\n \"agents\": {\n \"defaults\": {\n \"provider\": \"zhipu\",\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\n**Nova Configuração (recomendada):**\n```json\n{\n \"model_list\": [\n {\n \"model_name\": \"glm-4.7\",\n \"model\": \"zhipu/glm-4.7\",\n \"api_key\": \"your-key\"\n }\n ],\n \"agents\": {\n \"defaults\": {\n \"model\": \"glm-4.7\"\n }\n }\n}\n```\n\nPara o guia de migração detalhado, consulte [docs/migration/model-list-migration.md](docs/migration/model-list-migration.md).\n\n## Referência CLI\n\n| Comando | Descrição |\n| --- | --- |\n| `malikclaw onboard` | Inicializar configuração & workspace |\n| `malikclaw agent -m \"...\"` | Conversar com o agente |\n| `malikclaw agent` | Modo de chat interativo |\n| `malikclaw gateway` | Iniciar o gateway (para bots de chat) |\n| `malikclaw status` | Mostrar status |\n| `malikclaw cron list` | Listar todas as tarefas agendadas |\n| `malikclaw cron add ...` | Adicionar uma tarefa agendada |\n\n### Tarefas Agendadas / Lembretes\n\nO MalikClaw suporta lembretes agendados e tarefas recorrentes por meio da ferramenta `cron`:\n\n* **Lembretes únicos**: \"Remind me in 10 minutes\" (Me lembre em 10 minutos) → dispara uma vez após 10min\n* **Tarefas recorrentes**: \"Remind me every 2 hours\" (Me lembre a cada 2 horas) → dispara a cada 2 horas\n* **Expressões Cron**: \"Remind me at 9am daily\" (Me lembre às 9h todos os dias) → usa expressão cron\n\nAs tarefas são armazenadas em `~/.malikclaw/workspace/cron/` e processadas automaticamente.\n\n## 🤝 Contribuir & Roadmap\n\nPRs são bem-vindos! O código-fonte é intencionalmente pequeno e legível. 🤗\n\nRoadmap em breve...\n\nGrupo de desenvolvedores em formação. Requisito de entrada: Pelo menos 1 PR com merge.\n\nGrupos de usuários:\n\nDiscord: <https://discord.gg/V4sAZ9XWpN>\n\n<img src=\"assets/wechat.png\" alt=\"MalikClaw\" width=\"512\">\n\n## 🐛 Solução de Problemas\n\n### Busca web mostra \"API 配置问题\"\n\nIsso é normal se você ainda não configurou uma API key de busca. O MalikClaw fornecerá links úteis para busca manual.\n\nPara habilitar a busca web:\n\n1. **Opção 1 (Recomendado)**: Obtenha uma API key gratuita em [https://brave.com/search/api](https://brave.com/search/api) (2000 consultas grátis/mês) para os melhores resultados.\n2. **Opção 2 (Sem Cartão de Crédito)**: Se você não tem uma key, o sistema automaticamente usa o **DuckDuckGo** como fallback (sem necessidade de key).\n\nAdicione a key em `~/.malikclaw/config.json` se usar o Brave:\n\n```json\n{\n \"tools\": {\n \"web\": {\n \"brave\": {\n \"enabled\": false,\n \"api_key\": \"YOUR_BRAVE_API_KEY\",\n \"max_results\": 5\n },\n \"duckduckgo\": {\n \"enabled\": true,\n \"max_results\": 5\n }\n }\n }\n}\n```\n\n### Erros de filtragem de conteúdo\n\nAlguns provedores (como Zhipu) possuem filtragem de conteúdo. Tente reformular sua pergunta ou use um modelo diferente.\n\n### Bot do Telegram diz \"Conflict: terminated by other getUpdates\"\n\nIsso acontece quando outra instância do bot está em execução. Certifique-se de que apenas um `malikclaw gateway` esteja rodando por vez.\n\n---\n\n## 📝 Comparação de API Keys\n\n| Serviço | Plano Gratuito | Caso de Uso |\n| --- | --- | --- |\n| **OpenRouter** | 200K tokens/mês | Múltiplos modelos (Claude, GPT-4, etc.) |\n| **Volcengine CodingPlan** | ¥9,9/primeiro mês | Ideal para usuários chineses, múltiplos modelos SOTA (Doubao, DeepSeek, etc.) |\n| **Zhipu** | 200K tokens/mês | Adequado para usuários chineses |\n| **Brave Search** | 2000 consultas/mês | Funcionalidade de busca web |\n| **Groq** | Plano gratuito disponível | Inferência ultra-rápida (Llama, Mixtral) |\n| **Cerebras** | Plano gratuito disponível | Inferência ultra-rápida (Llama 3.3 70B) |\n| **ModelScope** | 2000 requisições/dia | Inferência gratuita (Qwen, GLM, DeepSeek, etc.) |\n\n---\n\n<div align=\"center\">\n <img src=\"assets/logo.jpg\" alt=\"MalikClaw Meme\" width=\"512\">\n</div>\n"}}, "pkg/providers/factory_test.go": {"7b53c27818f2fe5f37c2c6d06131af812268e82f": {"t": 1785746066.1610022, "n": 10745, "h": "7edb69455a414def", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/AbdullahMalik17/malikclaw/pkg/auth\"\n\t\"github.com/AbdullahMalik17/malikclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit litellm provider uses configured base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t\tcfg.Providers.LiteLLM.APIBase = \"http://localhost:4000/v1\"\n\t\t\t\tcfg.Providers.LiteLLM.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit litellm provider defaults base when only key is configured\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit vivgrid provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"vivgrid\"\n\t\t\t\tcfg.Providers.Vivgrid.APIKey = \"vivgrid-key\"\n\t\t\t\tcfg.Providers.Vivgrid.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.vivgrid.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit longcat provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"longcat\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t\tcfg.Providers.LongCat.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"longcat model fallback uses longcat base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"longcat/LongCat-Flash-Thinking\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "842bcbfec51ca3da0fbc771f225028d3a70d936f": {"t": 1785759432.102997, "n": 10745, "h": "7edb69455a414def", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/AbdullahMalik17/malikclaw/pkg/auth\"\n\t\"github.com/AbdullahMalik17/malikclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit litellm provider uses configured base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t\tcfg.Providers.LiteLLM.APIBase = \"http://localhost:4000/v1\"\n\t\t\t\tcfg.Providers.LiteLLM.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit litellm provider defaults base when only key is configured\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit vivgrid provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"vivgrid\"\n\t\t\t\tcfg.Providers.Vivgrid.APIKey = \"vivgrid-key\"\n\t\t\t\tcfg.Providers.Vivgrid.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.vivgrid.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit longcat provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"longcat\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t\tcfg.Providers.LongCat.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"longcat model fallback uses longcat base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"longcat/LongCat-Flash-Thinking\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "423e1071ce742174ca8236def7dad12d22e5578c": {"t": 1785759433.8903797, "n": 10727, "h": "fac48297e4dd8d47", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/malikclaw/pkg/auth\"\n\t\"github.com/sipeed/malikclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit litellm provider uses configured base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t\tcfg.Providers.LiteLLM.APIBase = \"http://localhost:4000/v1\"\n\t\t\t\tcfg.Providers.LiteLLM.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit litellm provider defaults base when only key is configured\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit vivgrid provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"vivgrid\"\n\t\t\t\tcfg.Providers.Vivgrid.APIKey = \"vivgrid-key\"\n\t\t\t\tcfg.Providers.Vivgrid.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.vivgrid.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit longcat provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"longcat\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t\tcfg.Providers.LongCat.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"longcat model fallback uses longcat base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"longcat/LongCat-Flash-Thinking\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "9222351871994df738ef2a09559afb60e2ce138f": {"t": 1785759435.4143429, "n": 10725, "h": "10a8c3f5a2893050", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/auth\"\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit litellm provider uses configured base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t\tcfg.Providers.LiteLLM.APIBase = \"http://localhost:4000/v1\"\n\t\t\t\tcfg.Providers.LiteLLM.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit litellm provider defaults base when only key is configured\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit vivgrid provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"vivgrid\"\n\t\t\t\tcfg.Providers.Vivgrid.APIKey = \"vivgrid-key\"\n\t\t\t\tcfg.Providers.Vivgrid.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.vivgrid.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit longcat provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"longcat\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t\tcfg.Providers.LongCat.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"longcat model fallback uses longcat base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"longcat/LongCat-Flash-Thinking\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "0c17c075da6e5cae378e9c4cc03c16ee05342ab1": {"t": 1785759436.7212596, "n": 10019, "h": "365be96faed7a85c", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/auth\"\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit litellm provider uses configured base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t\tcfg.Providers.LiteLLM.APIBase = \"http://localhost:4000/v1\"\n\t\t\t\tcfg.Providers.LiteLLM.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit litellm provider defaults base when only key is configured\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit vivgrid provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"vivgrid\"\n\t\t\t\tcfg.Providers.Vivgrid.APIKey = \"vivgrid-key\"\n\t\t\t\tcfg.Providers.Vivgrid.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.vivgrid.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "ea0b634b3b05681511bdfa4fc4bf7ba6886a0669": {"t": 1785759439.0382571, "n": 9258, "h": "591d7d73ded30657", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/auth\"\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit vivgrid provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"vivgrid\"\n\t\t\t\tcfg.Providers.Vivgrid.APIKey = \"vivgrid-key\"\n\t\t\t\tcfg.Providers.Vivgrid.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.vivgrid.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "946af6b53db371a1dba5a09ae52ca3c034d65086": {"t": 1785759440.3043168, "n": 9636, "h": "5d2f01f77fba79be", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/auth\"\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit litellm provider uses configured base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t\tcfg.Providers.LiteLLM.APIBase = \"http://localhost:4000/v1\"\n\t\t\t\tcfg.Providers.LiteLLM.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit litellm provider defaults base when only key is configured\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "dc9fb327c2efdca728aa4a49ab21e311499f7021": {"t": 1785759441.6744742, "n": 8875, "h": "c6587ab33f93dbb2", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/auth\"\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "5cd1597674494b8620753099f653f0cbd7366ba3": {"t": 1785759443.498855, "n": 8882, "h": "7502b2a10b8f38e7", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/auth\"\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4-5-20250929\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-3-sonnet\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "68cdafc5f2932b173bf193664430cff2630cb0f9": {"t": 1785759444.985722, "n": 8739, "h": "3f5086a0048025e8", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/auth\"\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4-5-20250929\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-3-sonnet\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}, "c4cbb5fb35374d0ff917baff9196746f843b99fa": {"t": 1785759449.2365916, "n": 9015, "h": "297a089acad56ecd", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/auth\"\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4-5-20250929\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexProviderForCodexCliAuthMethod(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Provider = \"openai\"\n\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Provider = \"anthropic\"\n\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\tcfg.Providers.Anthropic.APIBase = \"https://proxy.example.com/v1\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tclaudeProvider, ok := provider.(*ClaudeProvider)\n\tif !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\tif got := claudeProvider.delegate.BaseURL(); got != \"https://proxy.example.com\" {\n\t\tt.Fatalf(\"anthropic baseURL = %q, want %q\", got, \"https://proxy.example.com\")\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"openai\" {\n\t\t\tt.Fatalf(\"provider = %q, want openai\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"openai-token\",\n\t\t\tAccountID: \"acct_123\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Provider = \"openai\"\n\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexProvider\", provider)\n\t}\n}\n"}, "e3c246a36f58c1fa261470d9b38ec009b44f9b12": {"t": 1785759450.5264878, "n": 5939, "h": "9a29bf6645992a9b", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4-5-20250929\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexProviderForCodexCliAuthMethod(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Provider = \"openai\"\n\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexProvider\", provider)\n\t}\n}\n"}, "a6e885bb473a20d671ed1dab5e8e8ea9bb8cd399": {"t": 1785759451.955077, "n": 4341, "h": "41ad4afce34f63b1", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sipeed/picoclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4-5-20250929\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\n\tprovider, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n"}, "0769f1f285250aec7f5fe43994c0b1c635194e5c": {"t": 1786068371.1418622, "n": 10745, "h": "7edb69455a414def", "c": "package providers\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/AbdullahMalik17/malikclaw/pkg/auth\"\n\t\"github.com/AbdullahMalik17/malikclaw/pkg/config\"\n)\n\nfunc TestResolveProviderSelection(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func(*config.Config)\n\t\twantType providerType\n\t\twantAPIBase string\n\t\twantProxy string\n\t\twantErrSubstr string\n\t}{\n\t\t{\n\t\t\tname: \"explicit litellm provider uses configured base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t\tcfg.Providers.LiteLLM.APIBase = \"http://localhost:4000/v1\"\n\t\t\t\tcfg.Providers.LiteLLM.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit litellm provider defaults base when only key is configured\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"litellm\"\n\t\t\t\tcfg.Providers.LiteLLM.APIKey = \"litellm-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:4000/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit claude-cli provider routes to cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"claude-cli\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit copilot provider routes to github copilot type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"copilot\"\n\t\t\t},\n\t\t\twantType: providerTypeGitHubCopilot,\n\t\t\twantAPIBase: \"localhost:4321\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit deepseek provider uses deepseek defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"deepseek\"\n\t\t\t\tcfg.Agents.Defaults.Model = \"deepseek/deepseek-chat\"\n\t\t\t\tcfg.Providers.DeepSeek.APIKey = \"deepseek-key\"\n\t\t\t\tcfg.Providers.DeepSeek.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.deepseek.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit shengsuanyun provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"shengsuanyun\"\n\t\t\t\tcfg.Providers.ShengSuanYun.APIKey = \"ssy-key\"\n\t\t\t\tcfg.Providers.ShengSuanYun.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://router.shengsuanyun.com/api/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit nvidia provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"nvidia\"\n\t\t\t\tcfg.Providers.Nvidia.APIKey = \"nvapi-test\"\n\t\t\t\tcfg.Providers.Nvidia.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://integrate.api.nvidia.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit vivgrid provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"vivgrid\"\n\t\t\t\tcfg.Providers.Vivgrid.APIKey = \"vivgrid-key\"\n\t\t\t\tcfg.Providers.Vivgrid.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.vivgrid.com/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter model uses openrouter defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t\tcfg.Providers.OpenRouter.APIKey = \"sk-or-test\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"anthropic oauth routes to claude auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"claude-sonnet-4.6\"\n\t\t\t\tcfg.Providers.Anthropic.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeClaudeAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai oauth routes to codex auth provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"oauth\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexAuth,\n\t\t},\n\t\t{\n\t\t\tname: \"openai codex-cli auth routes to codex cli token provider\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"gpt-4o\"\n\t\t\t\tcfg.Providers.OpenAI.AuthMethod = \"codex-cli\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLIToken,\n\t\t},\n\t\t{\n\t\t\tname: \"explicit codex-code provider routes to codex cli provider type\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"codex-code\"\n\t\t\t\tcfg.Agents.Defaults.Workspace = \"/tmp/ws\"\n\t\t\t},\n\t\t\twantType: providerTypeCodexCLI,\n\t\t},\n\t\t{\n\t\t\tname: \"zhipu model uses zhipu base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"glm-4.7\"\n\t\t\t\tcfg.Providers.Zhipu.APIKey = \"zhipu-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\t},\n\t\t{\n\t\t\tname: \"groq model uses groq base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"groq/llama-3.3-70b\"\n\t\t\t\tcfg.Providers.Groq.APIKey = \"gsk-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.groq.com/openai/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"ollama model uses ollama base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"ollama/qwen2.5:14b\"\n\t\t\t\tcfg.Providers.Ollama.APIKey = \"ollama-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"http://localhost:11434/v1\",\n\t\t},\n\t\t{\n\t\t\tname: \"moonshot model keeps proxy and default base\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"moonshot/kimi-k2.5\"\n\t\t\t\tcfg.Providers.Moonshot.APIKey = \"moonshot-key\"\n\t\t\t\tcfg.Providers.Moonshot.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.moonshot.cn/v1\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"explicit longcat provider uses defaults\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Provider = \"longcat\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t\tcfg.Providers.LongCat.Proxy = \"http://127.0.0.1:7890\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t\twantProxy: \"http://127.0.0.1:7890\",\n\t\t},\n\t\t{\n\t\t\tname: \"longcat model fallback uses longcat base default\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"longcat/LongCat-Flash-Thinking\"\n\t\t\t\tcfg.Providers.LongCat.APIKey = \"longcat-key\"\n\t\t\t},\n\t\t\twantType: providerTypeHTTPCompat,\n\t\t\twantAPIBase: \"https://api.longcat.chat/openai\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing keys returns model config error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"custom-model\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for model\",\n\t\t},\n\t\t{\n\t\t\tname: \"openrouter prefix without key returns provider key error\",\n\t\t\tsetup: func(cfg *config.Config) {\n\t\t\t\tcfg.Agents.Defaults.Model = \"openrouter/auto\"\n\t\t\t},\n\t\t\twantErrSubstr: \"no API key configured for provider\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcfg := config.DefaultConfig()\n\t\t\ttt.setup(cfg)\n\n\t\t\tgot, err := resolveProviderSelection(cfg)\n\t\t\tif tt.wantErrSubstr != \"\" {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Fatalf(\"expected error containing %q, got nil\", tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\tif !strings.Contains(err.Error(), tt.wantErrSubstr) {\n\t\t\t\t\tt.Fatalf(\"error = %q, want substring %q\", err.Error(), tt.wantErrSubstr)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"resolveProviderSelection() error = %v\", err)\n\t\t\t}\n\t\t\tif got.providerType != tt.wantType {\n\t\t\t\tt.Fatalf(\"providerType = %v, want %v\", got.providerType, tt.wantType)\n\t\t\t}\n\t\t\tif tt.wantAPIBase != \"\" && got.apiBase != tt.wantAPIBase {\n\t\t\t\tt.Fatalf(\"apiBase = %q, want %q\", got.apiBase, tt.wantAPIBase)\n\t\t\t}\n\t\t\tif tt.wantProxy != \"\" && got.proxy != tt.wantProxy {\n\t\t\t\tt.Fatalf(\"proxy = %q, want %q\", got.proxy, tt.wantProxy)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCreateProviderReturnsHTTPProviderForOpenRouter(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-openrouter\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-openrouter\",\n\t\t\tModel: \"openrouter/auto\",\n\t\t\tAPIKey: \"sk-or-test\",\n\t\t\tAPIBase: \"https://openrouter.ai/api/v1\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*HTTPProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *HTTPProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsCodexCliProviderForCodexCode(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-codex\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-codex\",\n\t\t\tModel: \"codex-cli/codex-model\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*CodexCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *CodexCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeCliProviderForClaudeCli(t *testing.T) {\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-cli\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-cli\",\n\t\t\tModel: \"claude-cli/claude-sonnet\",\n\t\t\tWorkspace: \"/tmp/workspace\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeCliProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeCliProvider\", provider)\n\t}\n}\n\nfunc TestCreateProviderReturnsClaudeProviderForAnthropicOAuth(t *testing.T) {\n\toriginalGetCredential := getCredential\n\tt.Cleanup(func() { getCredential = originalGetCredential })\n\n\tgetCredential = func(provider string) (*auth.AuthCredential, error) {\n\t\tif provider != \"anthropic\" {\n\t\t\tt.Fatalf(\"provider = %q, want anthropic\", provider)\n\t\t}\n\t\treturn &auth.AuthCredential{\n\t\t\tAccessToken: \"anthropic-token\",\n\t\t}, nil\n\t}\n\n\tcfg := config.DefaultConfig()\n\tcfg.Agents.Defaults.Model = \"test-claude-oauth\"\n\tcfg.ModelList = []config.ModelConfig{\n\t\t{\n\t\t\tModelName: \"test-claude-oauth\",\n\t\t\tModel: \"anthropic/claude-sonnet-4.6\",\n\t\t\tAuthMethod: \"oauth\",\n\t\t},\n\t}\n\n\tprovider, _, err := CreateProvider(cfg)\n\tif err != nil {\n\t\tt.Fatalf(\"CreateProvider() error = %v\", err)\n\t}\n\n\tif _, ok := provider.(*ClaudeProvider); !ok {\n\t\tt.Fatalf(\"provider type = %T, want *ClaudeProvider\", provider)\n\t}\n\t// TODO: Test custom APIBase when createClaudeAuthProvider supports it\n}\n\nfunc TestCreateProviderReturnsCodexProviderForOpenAIOAuth(t *testing.T) {\n\t// TODO: This test requires openai protocol to support auth_method: \"oauth\"\n\t// which is not yet implemented in the new factory_provider.go\n\tt.Skip(\"OpenAI OAuth via model_list not yet implemented\")\n}\n"}}}}