๐Ÿค– Clawdbot ไปฃ็ ๆžถๆž„ๆทฑๅบฆ่งฃๆž

ไธ€ใ€ๆฆ‚่ฟฐ

Clawdbot ๆ˜ฏไธ€ไธช AI ๅŠฉๆ‰‹ๆก†ๆžถ๏ผŒๅฎƒๅฐฑๅƒไธ€ไธชใ€Œๆ™บ่ƒฝไธญ่ฝฌ็ซ™ใ€๏ผŒ่ฟžๆŽฅ็€ไฝ ๏ผˆ้€š่ฟ‡ Telegramใ€Discord ็ญ‰ๆธ ้“๏ผ‰ๅ’Œ AI ๅคง่„‘๏ผˆClaudeใ€GPT ็ญ‰ๆจกๅž‹๏ผ‰ใ€‚ๅฎƒไธไป…่ƒฝ็†่งฃไฝ ็š„ๆถˆๆฏ๏ผŒ่ฟ˜่ƒฝ่ฐƒ็”จๅ„็งๅทฅๅ…ทๆฅๅฎŒๆˆไปปๅŠกใ€‚

็”จ้€šไฟ—็š„่ฏ่ฏด๏ผš

> Clawdbot ๅฐฑๅƒไธ€ไธชๅ…จ่ƒฝ็ฎกๅฎถ๏ผŒไฝ ้€š่ฟ‡ๅพฎไฟก/Telegram ๅ‘ๆถˆๆฏ็ป™ไป–๏ผŒไป–ไผš่ฐƒๅŠจๅ„็ง่ต„ๆบ๏ผˆๆ‰ง่กŒๅ‘ฝไปคใ€่ฏปๅ†™ๆ–‡ไปถใ€ๆœ็ดข็ฝ‘้กต๏ผ‰ๆฅๅธฎไฝ ๅฎŒๆˆไปปๅŠก๏ผŒ็„ถๅŽๆŠŠ็ป“ๆžœๅ‘Š่ฏ‰ไฝ ใ€‚

ไบŒใ€ๆ•ดไฝ“ๆžถๆž„ๅ›พ


โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          ็”จๆˆทไบคไบ’ๅฑ‚                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”‚
โ”‚  โ”‚ Telegram โ”‚  โ”‚ Discord  โ”‚  โ”‚  Signal  โ”‚  โ”‚ WhatsApp โ”‚   ...      โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜            โ”‚
โ”‚       โ”‚             โ”‚             โ”‚             โ”‚                   โ”‚
โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         Gateway ็ฝ‘ๅ…ณๅฑ‚                               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚  HTTP/WebSocket ๆœๅŠกๅ™จ (้ป˜่ฎค็ซฏๅฃ 18789)                       โ”‚    โ”‚
โ”‚  โ”‚  โ€ข ๆถˆๆฏ่ทฏ็”ฑ โ€ข ไผš่ฏ็ฎก็† โ€ข ๅฅๅบทๆฃ€ๆŸฅ โ€ข ้…็ฝฎ้‡่ฝฝ                    โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                             โ”‚                                       โ”‚
โ”‚      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”‚
โ”‚      โ–ผ                      โ–ผ                      โ–ผ               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚
โ”‚  โ”‚ Channelโ”‚           โ”‚ Sessions โ”‚           โ”‚   Cron   โ”‚          โ”‚
โ”‚  โ”‚ Managerโ”‚           โ”‚ Manager  โ”‚           โ”‚ Schedulerโ”‚          โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          Agent ๆ™บ่ƒฝไฝ“ๅฑ‚                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚  PI (Provider Interface) - AI ๆจกๅž‹ไบคไบ’ๅผ•ๆ“Ž                    โ”‚    โ”‚
โ”‚  โ”‚  โ€ข ๆž„ๅปบๆ็คบ่ฏ (System Prompt)                                 โ”‚    โ”‚
โ”‚  โ”‚  โ€ข ๆตๅผๅ“ๅบ”ๅค„็†                                               โ”‚    โ”‚
โ”‚  โ”‚  โ€ข ๅทฅๅ…ท่ฐƒ็”จ็ผ–ๆŽ’                                               โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                             โ”‚                                       โ”‚
โ”‚      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”‚
โ”‚      โ–ผ                      โ–ผ                      โ–ผ               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚
โ”‚  โ”‚ Tools  โ”‚           โ”‚ Subagent โ”‚           โ”‚  Skills  โ”‚          โ”‚
โ”‚  โ”‚ System โ”‚           โ”‚ Registry โ”‚           โ”‚ Loader   โ”‚          โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         AI ๆจกๅž‹ๅฑ‚                                    โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”‚
โ”‚  โ”‚ Claude   โ”‚  โ”‚ GPT-4    โ”‚  โ”‚ Gemini   โ”‚  โ”‚ ๆœฌๅœฐๆจกๅž‹  โ”‚   ...      โ”‚
โ”‚  โ”‚(Anthropic)โ”‚ โ”‚ (OpenAI) โ”‚  โ”‚ (Google) โ”‚  โ”‚ (Ollama) โ”‚            โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ไธ‰ใ€ๆ ธๅฟƒ็ป„ไปถ่ฏฆ่งฃ

1. ๐Ÿšช Gateway๏ผˆ็ฝ‘ๅ…ณ๏ผ‰- ็ณป็ปŸ็š„ๅคง้—จ

ๆ–‡ไปถไฝ็ฝฎ๏ผš /dist/gateway/

Gateway ๆ˜ฏๆ•ดไธช็ณป็ปŸ็š„ใ€ŒๆŒ‡ๆŒฅไธญๅฟƒใ€๏ผŒ่ดŸ่ดฃ๏ผš

ๆ ธๅฟƒไปฃ็ ็คบไพ‹๏ผˆserver.impl.js๏ผ‰๏ผš


// Gateway ๅฏๅŠจๆ—ถๅš็š„ไบ‹ๆƒ…
export async function startGatewayServer(port = 18789, opts = {}) {
    // 1. ๅŠ ่ฝฝ้…็ฝฎ
    let configSnapshot = await readConfigFileSnapshot();
    
    // 2. ๅˆๅง‹ๅŒ–ๅญ Agent ๆณจๅ†Œ่กจ
    initSubagentRegistry();
    
    // 3. ๅŠ ่ฝฝๆ’ไปถ๏ผˆๅ„็งๆธ ้“ใ€ๅทฅๅ…ท๏ผ‰
    const { pluginRegistry, gatewayMethods } = loadGatewayPlugins({
        cfg: cfgAtStart,
        workspaceDir: defaultWorkspaceDir,
        // ...
    });
    
    // 4. ๅˆ›ๅปบ Channel ็ฎก็†ๅ™จ
    const channelManager = createChannelManager({ /* ... */ });
    
    // 5. ๅฏๅŠจ HTTP/WebSocket ๆœๅŠกๅ™จ
    // ...
}

้€šไฟ—็†่งฃ๏ผš

> Gateway ๅฐฑๅƒ้…’ๅบ—็š„ๅ‰ๅฐ๏ผŒๆ‰€ๆœ‰ๅฎขไบบ๏ผˆๆถˆๆฏ๏ผ‰้ƒฝ่ฆๅ…ˆ็ป่ฟ‡ๅ‰ๅฐ็™ป่ฎฐ๏ผŒ็„ถๅŽๅ‰ๅฐๅ†ณๅฎšๆŠŠไฝ ๅˆ†้…ๅˆฐๅ“ชไธชๆˆฟ้—ด๏ผˆไผš่ฏ๏ผ‰๏ผŒๅ†ๅซๆœๅŠกๅ‘˜๏ผˆAgent๏ผ‰ๆฅๆœๅŠกไฝ ใ€‚

2. ๐Ÿ“ฑ Channel๏ผˆๆธ ้“๏ผ‰- ๆถˆๆฏ็š„ๅ…ฅๅฃ

ๆ–‡ไปถไฝ็ฝฎ๏ผš /dist/channels/ ๅ’Œ /dist/telegram/

Channel ๆ˜ฏๆถˆๆฏ่ฟ›ๅ…ฅ็ณป็ปŸ็š„ๅ…ฅๅฃ๏ผŒๆฏ็ง่Šๅคฉๅนณๅฐ้ƒฝๆœ‰ๅฏนๅบ”็š„ Channel ๆ’ไปถ๏ผš


channels/
โ”œโ”€โ”€ plugins/
โ”‚   โ”œโ”€โ”€ telegram.js    # Telegram ๆ’ไปถ
โ”‚   โ”œโ”€โ”€ discord.js     # Discord ๆ’ไปถ
โ”‚   โ”œโ”€โ”€ signal.js      # Signal ๆ’ไปถ
โ”‚   โ”œโ”€โ”€ whatsapp.js    # WhatsApp ๆ’ไปถ
โ”‚   โ””โ”€โ”€ slack.js       # Slack ๆ’ไปถ

ไปฅ Telegram ไธบไพ‹๏ผˆtelegram/bot.js๏ผ‰๏ผš


export function createTelegramBot(opts) {
    // ไฝฟ็”จ grammy ๅบ“ๅˆ›ๅปบ Telegram Bot
    const bot = new Bot(opts.token);
    
    // ้…็ฝฎๆถˆๆฏ้™ๆต
    bot.api.config.use(apiThrottler());
    
    // ๆŒ‰่Šๅคฉ ID ้กบๅบๅค„็†ๆถˆๆฏ
    bot.use(sequentialize(getTelegramSequentialKey));
    
    // ๆณจๅ†Œๆถˆๆฏๅค„็†ๅ™จ
    registerTelegramHandlers({
        bot,
        processMessage,  // ๆ ธๅฟƒๅค„็†ๅ‡ฝๆ•ฐ
        // ...
    });
    
    return bot;
}

ๆถˆๆฏๅค„็†ๆต็จ‹๏ผˆbot-handlers.js๏ผ‰๏ผš


// ๅฝ“ๆ”ถๅˆฐ Telegram ๆถˆๆฏๆ—ถ
bot.on("message", async (ctx) => {
    // 1. ๆฃ€ๆŸฅๆ˜ฏๅฆ้‡ๅคๆถˆๆฏ
    if (shouldSkipUpdate(ctx)) return;
    
    // 2. ๆฃ€ๆŸฅๅ‘้€่€…ๆ˜ฏๅฆๆœ‰ๆƒ้™
    if (!isSenderAllowed(senderId, allowFrom)) return;
    
    // 3. ๅค„็†ๅช’ไฝ“๏ผˆๅ›พ็‰‡ใ€ๆ–‡ไปถ็ญ‰๏ผ‰
    const media = await resolveMedia(ctx, mediaMaxBytes);
    
    // 4. ไบค็ป™ๆถˆๆฏๅค„็†ๅ™จ
    await processMessage(ctx, media);
});

้€šไฟ—็†่งฃ๏ผš

> Channel ๅฐฑๅƒไธๅŒ็š„้—จ๏ผˆTelegram ้—จใ€Discord ้—จ๏ผ‰๏ผŒๆฏไธช้—จ้ƒฝๆœ‰่‡ชๅทฑ็š„้—จๅซ๏ผŒไฝ†่ฟ›ๆฅไน‹ๅŽ้ƒฝ่ตฐๅŒไธ€ๆก่ทฏๅŽป่ง AI ็ฎกๅฎถใ€‚

3. ๐Ÿง  Agent๏ผˆๆ™บ่ƒฝไฝ“๏ผ‰- AI ็š„ๅคง่„‘

ๆ–‡ไปถไฝ็ฝฎ๏ผš /dist/agents/

Agent ๆ˜ฏๅฎž้™…ไธŽ AI ๆจกๅž‹ๅฏน่ฏ็š„็ป„ไปถ๏ผŒๆ ธๅฟƒ่Œ่ดฃ๏ผš

System Prompt ๆž„ๅปบ๏ผˆsystem-prompt.js๏ผ‰๏ผš


// AI ็š„ใ€Œ่บซไปฝ่ฏใ€ๅ’Œใ€Œ่ƒฝๅŠ›่ฏดๆ˜Žไนฆใ€
function buildSystemPrompt(params) {
    const sections = [
        // 1. ๅŸบ็ก€่บซไปฝ
        buildUserIdentitySection(ownerLine),
        
        // 2. ๅฏ็”จๆŠ€่ƒฝ
        buildSkillsSection(params),
        
        // 3. ๆถˆๆฏๅ‘้€่ƒฝๅŠ›
        buildMessagingSection(params),
        
        // 4. ๅทฅๅ…ทไฝฟ็”จ่ฏดๆ˜Ž
        buildToolsSection(params),
        
        // 5. ๅฝ“ๅ‰ๆ—ถ้—ด
        buildTimeSection(params),
    ];
    
    return sections.flat().join('\n');
}

ๆตๅผๅ“ๅบ”่ฎข้˜…๏ผˆpi-embedded-subscribe.js๏ผ‰๏ผš


export function subscribeEmbeddedPiSession(params) {
    const state = {
        assistantTexts: [],      // AI ็š„ๅ›žๅคๆ–‡ๆœฌ
        toolMetas: [],           // ๅทฅๅ…ท่ฐƒ็”จไฟกๆฏ
        deltaBuffer: "",         // ๆตๅผๆ–‡ๆœฌ็ผ“ๅ†ฒ
        // ...
    };
    
    // ๅค„็† AI ่ฟ”ๅ›ž็š„ๆฏไธชๆ–‡ๆœฌ็‰‡ๆฎต
    const pushAssistantText = (text) => {
        if (!text) return;
        assistantTexts.push(text);
    };
    
    // ๅค„็†ๅทฅๅ…ท่ฐƒ็”จ
    const handleToolCall = (toolCall) => {
        toolMetas.push({
            name: toolCall.name,
            input: toolCall.input,
            // ...
        });
    };
    
    // ...
}

้€šไฟ—็†่งฃ๏ผš

> Agent ๅฐฑๅƒ AI ็š„ใ€Œ็ฟป่ฏ‘ๅฎ˜ใ€๏ผŒๆŠŠไฝ ็š„ๆถˆๆฏ็ฟป่ฏ‘ๆˆ AI ่ƒฝ็†่งฃ็š„ๆ ผๅผ๏ผŒๅ†ๆŠŠ AI ็š„ๅ›žๅค็ฟป่ฏ‘ๆˆไฝ ่ƒฝ็œ‹ๆ‡‚็š„ๆถˆๆฏใ€‚

4. ๐Ÿ”ง Tools๏ผˆๅทฅๅ…ท๏ผ‰- AI ็š„ๅŒๆ‰‹

ๆ–‡ไปถไฝ็ฝฎ๏ผš /dist/agents/pi-tools.js ๅ’Œ /dist/agents/bash-tools.exec.js

Tools ๆ˜ฏ AI ่ƒฝๅคŸ่ฐƒ็”จ็š„ๅ„็งๅŠŸ่ƒฝ๏ผŒๅŒ…ๆ‹ฌ๏ผš

ๅทฅๅ…ทๅฎšไน‰็คบไพ‹๏ผˆbash-tools.exec.js๏ผ‰๏ผš


const execSchema = Type.Object({
    command: Type.String({ 
        description: "Shell command to execute" 
    }),
    workdir: Type.Optional(Type.String({ 
        description: "Working directory" 
    })),
    timeout: Type.Optional(Type.Number({
        description: "Timeout in seconds"
    })),
    // ...
});

// ๆ‰ง่กŒๅ‘ฝไปค็š„ๆ ธๅฟƒ้€ป่พ‘
async function runExecTool(params) {
    const { command, workdir, timeout } = params;
    
    // 1. ๅฎ‰ๅ…จๆฃ€ๆŸฅ
    if (requiresExecApproval(command, security)) {
        await requestApproval(command);
    }
    
    // 2. ๆ‰ง่กŒๅ‘ฝไปค
    const result = await spawnWithFallback({
        command,
        cwd: workdir,
        timeout: timeout * 1000,
    });
    
    // 3. ่ฟ”ๅ›ž่พ“ๅ‡บ
    return {
        output: result.stdout,
        exitCode: result.exitCode,
    };
}

ๅทฅๅ…ท็ญ–็•ฅๆŽงๅˆถ๏ผˆpi-tools.policy.js๏ผ‰๏ผš


// ๆ นๆฎ้…็ฝฎๅ†ณๅฎšๅ“ชไบ›ๅทฅๅ…ทๅฏ็”จ
export function filterToolsByPolicy(tools, policies) {
    return tools.filter(tool => {
        // ๆฃ€ๆŸฅๅ…จๅฑ€็ญ–็•ฅ
        if (!isToolAllowedByPolicies(tool.name, policies)) {
            return false;
        }
        return true;
    });
}

้€šไฟ—็†่งฃ๏ผš

> Tools ๅฐฑๅƒ็ฎกๅฎถ็š„ๅ„็งๆŠ€่ƒฝโ€”โ€”ไผšๅš้ฅญ๏ผˆexec๏ผ‰ใ€ไผšๆ•ด็†ๆ–‡ไปถ๏ผˆread/write๏ผ‰ใ€ไผšไธŠ็ฝ‘ๆŸฅ่ต„ๆ–™๏ผˆweb_search๏ผ‰ใ€‚AI ๅ†ณๅฎš่ฆๅšไป€ไนˆ๏ผŒ็„ถๅŽ่ฐƒ็”จๅฏนๅบ”็š„ๆŠ€่ƒฝๆฅๅฎŒๆˆใ€‚

5. ๐Ÿ“‹ Session๏ผˆไผš่ฏ๏ผ‰- ๅฏน่ฏ็š„่ฎฐๅฟ†

ๆ–‡ไปถไฝ็ฝฎ๏ผš /dist/sessions/ ๅ’Œ /dist/gateway/session-utils.js

Session ็ฎก็†ๅฏน่ฏ็š„ไธŠไธ‹ๆ–‡ๅ’Œๅކๅฒ๏ผš

Session Key ็š„็ป„ๆˆ๏ผˆsession-key.js๏ผ‰๏ผš


// Session Key ็š„ๆ ผๅผ็คบไพ‹๏ผš
// - agent:main:main          โ†’ ไธป Agent ็š„ไธปไผš่ฏ
// - agent:main:telegram:dm:123456  โ†’ Telegram ็ง่Šไผš่ฏ
// - agent:main:subagent:abc123     โ†’ ๅญ Agent ไผš่ฏ

export function buildAgentMainSessionKey(params) {
    const agentId = normalizeAgentId(params.agentId);  // "main"
    const mainKey = normalizeMainKey(params.mainKey);  // "main"
    return `agent:${agentId}:${mainKey}`;              // "agent:main:main"
}

export function buildAgentPeerSessionKey(params) {
    // ไธบๆฏไธช่Šๅคฉๅฏน่ฑกๅˆ›ๅปบ็‹ฌ็ซ‹ไผš่ฏ
    return `agent:${agentId}:${channel}:dm:${peerId}`;
}

้€šไฟ—็†่งฃ๏ผš

> Session ๅฐฑๅƒไฝ ๅ’Œ็ฎกๅฎถ็š„ๅฏน่ฏ่ฎฐๅฝ•ๆœฌ๏ผŒ็ฎกๅฎถ็Ÿฅ้“ไฝ ไธŠๆฌก่Šไบ†ไป€ไนˆ๏ผŒ่ƒฝๆŽฅ็€ไน‹ๅ‰็š„่ฏ้ข˜็ปง็ปญ่Šใ€‚

6. ๐Ÿ‘ถ Subagent๏ผˆๅญๆ™บ่ƒฝไฝ“๏ผ‰- ๅˆ†่บซๆœฏ

ๆ–‡ไปถไฝ็ฝฎ๏ผš /dist/agents/subagent-registry.js

ๅฝ“ไปปๅŠกๅคๆ‚ๆ—ถ๏ผŒไธป Agent ๅฏไปฅๆดพ็”Ÿๅญ Agent ๆฅๅนถ่กŒๅค„็†๏ผš


// ๅญ Agent ๆณจๅ†Œ่กจ
const subagentRuns = new Map();

// ๆณจๅ†Œๆ–ฐ็š„ๅญ Agent
export function registerSubagentRun(params) {
    const runId = generateRunId();
    
    subagentRuns.set(runId, {
        runId,
        childSessionKey: params.childSessionKey,
        requesterSessionKey: params.requesterSessionKey,
        task: params.task,                    // ๅญ Agent ็š„ไปปๅŠกๆ่ฟฐ
        startedAt: Date.now(),
        outcome: null,                        // ๅฎŒๆˆๅŽ็š„็ป“ๆžœ
    });
    
    return runId;
}

// ็ญ‰ๅพ…ๅญ Agent ๅฎŒๆˆ
async function waitForSubagentCompletion(runId, timeoutMs) {
    const entry = subagentRuns.get(runId);
    if (!entry) return;
    
    // ็›‘ๅฌ Agent ไบ‹ไปถ
    onAgentEvent((evt) => {
        if (evt.runId === runId && evt.data?.phase === 'done') {
            // ๅญ Agent ๅฎŒๆˆ๏ผŒ้€š็Ÿฅไธป Agent
            announceSubagentCompletion(entry);
        }
    });
}

้€šไฟ—็†่งฃ๏ผš

> Subagent ๅฐฑๅƒไธป็ฎกๅฎถๅซๆฅ็š„ๅธฎๆ‰‹๏ผŒไธป็ฎกๅฎถ่ฏด"ไฝ ๅŽป่ฐƒๆŸฅ่ฟ™ไธช้—ฎ้ข˜"๏ผŒๅธฎๆ‰‹ๅฎŒๆˆๅŽๅ†ๅ‘ไธป็ฎกๅฎถๆฑ‡ๆŠฅใ€‚

ๅ››ใ€ๅ…ณ้”ฎๆต็จ‹่ฏฆ่งฃ

ๆต็จ‹1๏ผšไธ€ๆก Telegram ๆถˆๆฏ็š„ๅฎŒๆ•ดๆ—…็จ‹


โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ็”จๆˆทๅœจ Telegram ๅ‘้€: "ๅธฎๆˆ‘็œ‹็œ‹ๅฝ“ๅ‰็›ฎๅฝ•ๆœ‰ไป€ไนˆๆ–‡ไปถ"                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 1. Telegram Bot ๆŽฅๆ”ถๆถˆๆฏ                                                โ”‚
โ”‚    bot.on("message", async (ctx) => { ... })                           โ”‚
โ”‚    โ€ข ๆๅ–ๆถˆๆฏๆ–‡ๆœฌใ€ๅ‘้€่€…IDใ€่ŠๅคฉID                                       โ”‚
โ”‚    โ€ข ๆฃ€ๆŸฅๅ‘้€่€…ๆƒ้™                                                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 2. ๆž„ๅปบ Session Key                                                     โ”‚
โ”‚    sessionKey = "agent:main:telegram:dm:123456"                        โ”‚
โ”‚    โ€ข ๅŠ ่ฝฝ่ฏฅไผš่ฏ็š„ๅކๅฒๆถˆๆฏ                                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 3. ๅ‘้€ๅˆฐ Gateway                                                       โ”‚
โ”‚    gateway.call("chat.send", {                                         โ”‚
โ”‚        sessionKey: "agent:main:telegram:dm:123456",                    โ”‚
โ”‚        message: "ๅธฎๆˆ‘็œ‹็œ‹ๅฝ“ๅ‰็›ฎๅฝ•ๆœ‰ไป€ไนˆๆ–‡ไปถ",                              โ”‚
โ”‚        channel: "telegram"                                              โ”‚
โ”‚    })                                                                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 4. Agent ๆž„ๅปบ่ฏทๆฑ‚                                                       โ”‚
โ”‚    โ€ข ็”Ÿๆˆ System Prompt๏ผˆๅŒ…ๅซๅฏ็”จๅทฅๅ…ทๅˆ—่กจ๏ผ‰                               โ”‚
โ”‚    โ€ข ๆ‹ผๆŽฅๅކๅฒๆถˆๆฏ                                                        โ”‚
โ”‚    โ€ข ๆทปๅŠ ็”จๆˆทๆ–ฐๆถˆๆฏ                                                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 5. ่ฐƒ็”จ AI ๆจกๅž‹๏ผˆๅฆ‚ Claude๏ผ‰                                             โ”‚
โ”‚    API ่ฏทๆฑ‚ๅŒ…ๅซ:                                                        โ”‚
โ”‚    โ€ข system: "You are Claude Code, Anthropic's CLI..."                 โ”‚
โ”‚    โ€ข messages: [ไน‹ๅ‰็š„ๅฏน่ฏ + ๆ–ฐๆถˆๆฏ]                                     โ”‚
โ”‚    โ€ข tools: [exec, read, write, ...]                                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 6. AI ่ฟ”ๅ›žๅทฅๅ…ท่ฐƒ็”จ่ฏทๆฑ‚                                                   โ”‚
โ”‚    {                                                                    โ”‚
โ”‚      "type": "tool_use",                                               โ”‚
โ”‚      "name": "exec",                                                   โ”‚
โ”‚      "input": { "command": "ls -la" }                                  โ”‚
โ”‚    }                                                                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 7. ๆ‰ง่กŒๅทฅๅ…ท่ฐƒ็”จ                                                         โ”‚
โ”‚    const result = await execTool({ command: "ls -la" });               โ”‚
โ”‚    // ่ฟ”ๅ›ž: "total 32\ndrwxr-xr-x 5 user user 4096..."                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 8. ๆŠŠๅทฅๅ…ท็ป“ๆžœ่ฟ”ๅ›ž็ป™ AI                                                   โ”‚
โ”‚    AI ็œ‹ๅˆฐ็›ฎๅฝ•ๅˆ—่กจๅŽ๏ผŒ็”Ÿๆˆ่‡ช็„ถ่ฏญ่จ€ๅ›žๅค:                                    โ”‚
โ”‚    "ๅฝ“ๅ‰็›ฎๅฝ•ๆœ‰ไปฅไธ‹ๆ–‡ไปถๅ’Œๆ–‡ไปถๅคน๏ผš..."                                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 9. ๅ›žๅคๅ‘้€ๅˆฐ Telegram                                                  โ”‚
โ”‚    await sendMessageTelegram(chatId, "ๅฝ“ๅ‰็›ฎๅฝ•ๆœ‰ไปฅไธ‹ๆ–‡ไปถ...");           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆต็จ‹2๏ผšๅทฅๅ…ท่ฐƒ็”จ็š„ๅฎž็Žฐๆœบๅˆถ


// 1. AI ๅœจๅ›žๅคไธญๅŒ…ๅซๅทฅๅ…ท่ฐƒ็”จ
// AI Response:
{
  "content": [
    {
      "type": "tool_use",
      "id": "toolu_01XYZ",
      "name": "exec",
      "input": { "command": "ls -la" }
    }
  ]
}

// 2. ็ณป็ปŸ่งฃๆžๅทฅๅ…ท่ฐƒ็”จ
const toolCall = response.content.find(c => c.type === "tool_use");
const { name, input, id } = toolCall;

// 3. ๆ‰พๅˆฐๅฏนๅบ”็š„ๅทฅๅ…ทๅฎž็Žฐ
const tool = tools.find(t => t.name === name);

// 4. ๆ‰ง่กŒๅทฅๅ…ท
const result = await tool.execute(input);

// 5. ๆž„้€ ๅทฅๅ…ท็ป“ๆžœ
const toolResult = {
  type: "tool_result",
  tool_use_id: id,
  content: result.output
};

// 6. ๆŠŠ็ป“ๆžœๅ‘ๅ›ž็ป™ AI ็ปง็ปญๅฏน่ฏ
messages.push({ role: "user", content: [toolResult] });
// ๅ†ๆฌก่ฐƒ็”จ AI API...

ๆต็จ‹3๏ผšๅญ Agent ็š„ๆดพๅ‘ไธŽๅ›žๆ”ถ


// ไธป Agent ๅ†ณๅฎšๆดพๅ‘ๅญไปปๅŠก
// System Prompt ไธญ็š„ๆŒ‡ๅฏผ๏ผš
// "If a task is complex, spawn a sub-agent to handle it..."

// 1. ไธป Agent ่ฐƒ็”จ sessions_spawn ๅทฅๅ…ทๆดพๅ‘ๅญ Agent
await sessions_spawn({
  task: "ๅˆ†ๆž่ฟ™ไธชไปฃ็ ๅบ“็š„ๆžถๆž„",
  label: "code-analysis"
});

// 2. ็ณป็ปŸๅˆ›ๅปบๆ–ฐ็š„ Session
const childSessionKey = `agent:main:subagent:${generateId()}`;

// 3. ๆณจๅ†Œๅญ Agent
registerSubagentRun({
  runId,
  childSessionKey,
  requesterSessionKey: parentSessionKey,
  task: "ๅˆ†ๆž่ฟ™ไธชไปฃ็ ๅบ“็š„ๆžถๆž„",
  startedAt: Date.now()
});

// 4. ๅญ Agent ็‹ฌ็ซ‹่ฟ่กŒ
// ๆœ‰่‡ชๅทฑ็š„ๅฏน่ฏๅކๅฒ๏ผŒๆœ‰่‡ชๅทฑ็š„ๅทฅๅ…ท่ฎฟ้—ฎๆƒ้™

// 5. ๅญ Agent ๅฎŒๆˆๅŽ๏ผŒ็ณป็ปŸ้€š็Ÿฅไธป Agent
onAgentEvent((evt) => {
  if (evt.data?.phase === 'done') {
    // ๅ‘้€ๅฎŒๆˆ้€š็Ÿฅ็ป™ไธป Agent
    notifyParentAgent({
      message: `ๅญไปปๅŠกใ€Œ${label}ใ€ๅทฒๅฎŒๆˆ๏ผŒ็ป“ๆžœ๏ผš...`
    });
  }
});

ไบ”ใ€ๆ•ฐๆฎๆตๆ€ป็ป“


็”จๆˆทๆถˆๆฏ
    โ”‚
    โ–ผ
[Channel Plugin] โ”€โ”€่งฃๆžๆถˆๆฏโ”€โ”€โ–ถ [Gateway] โ”€โ”€่ทฏ็”ฑโ”€โ”€โ–ถ [Session Manager]
                                   โ”‚                      โ”‚
                                   โ”‚                      โ–ผ
                                   โ”‚              ๅŠ ่ฝฝๅฏน่ฏๅކๅฒ
                                   โ”‚                      โ”‚
                                   โ–ผ                      โ”‚
                              [Agent] โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                   โ”‚
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ–ผ              โ–ผ              โ–ผ
              ๆž„ๅปบ System    ๅ‡†ๅค‡ Messages   ๅŠ ่ฝฝ Tools
                Prompt           โ”‚              โ”‚
                    โ”‚            โ”‚              โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                   โ”‚
                                   โ–ผ
                            [AI Model API]
                                   โ”‚
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ–ผ              โ–ผ              โ–ผ
              ็บฏๆ–‡ๆœฌๅ›žๅค      ๅทฅๅ…ท่ฐƒ็”จ่ฏทๆฑ‚     ๆ€่€ƒ่ฟ‡็จ‹
                    โ”‚              โ”‚              โ”‚
                    โ”‚              โ–ผ              โ”‚
                    โ”‚        [Tool Executor]      โ”‚
                    โ”‚              โ”‚              โ”‚
                    โ”‚              โ–ผ              โ”‚
                    โ”‚        ๅทฅๅ…ทๆ‰ง่กŒ็ป“ๆžœ         โ”‚
                    โ”‚              โ”‚              โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                   โ”‚
                                   โ–ผ
                           [Response Handler]
                                   โ”‚
                                   โ–ผ
                           ๅ‘้€ๅˆฐ็”จๆˆทๆธ ้“

ๅ…ญใ€็›ฎๅฝ•็ป“ๆž„้€ŸๆŸฅ่กจ


/usr/lib/node_modules/clawdbot/dist/
โ”‚
โ”œโ”€โ”€ gateway/          # ๐Ÿšช ็ฝ‘ๅ…ณๅฑ‚ - ็ณป็ปŸๅ…ฅๅฃ
โ”‚   โ”œโ”€โ”€ server.impl.js       # ็ฝ‘ๅ…ณๆœๅŠกๅ™จไธปๅฎž็Žฐ
โ”‚   โ”œโ”€โ”€ server-chat.js       # ่Šๅคฉๅค„็†
โ”‚   โ”œโ”€โ”€ server-channels.js   # ๆธ ้“็ฎก็†
โ”‚   โ””โ”€โ”€ session-utils.js     # ไผš่ฏๅทฅๅ…ท
โ”‚
โ”œโ”€โ”€ agents/           # ๐Ÿง  ๆ™บ่ƒฝไฝ“ๅฑ‚ - AI ไบคไบ’
โ”‚   โ”œโ”€โ”€ system-prompt.js     # ็ณป็ปŸๆ็คบ่ฏๆž„ๅปบ
โ”‚   โ”œโ”€โ”€ pi-embedded-subscribe.js  # AI ๅ“ๅบ”่ฎข้˜…
โ”‚   โ”œโ”€โ”€ pi-tools.js          # ๅทฅๅ…ทๅฎšไน‰
โ”‚   โ”œโ”€โ”€ bash-tools.exec.js   # exec ๅทฅๅ…ทๅฎž็Žฐ
โ”‚   โ””โ”€โ”€ subagent-registry.js # ๅญ Agent ็ฎก็†
โ”‚
โ”œโ”€โ”€ channels/         # ๐Ÿ“ฑ ๆธ ้“ๅฑ‚ - ๆถˆๆฏๅ…ฅๅฃ
โ”‚   โ””โ”€โ”€ plugins/
โ”‚       โ”œโ”€โ”€ telegram.js      # Telegram ๆ’ไปถ
โ”‚       โ”œโ”€โ”€ discord.js       # Discord ๆ’ไปถ
โ”‚       โ””โ”€โ”€ ...
โ”‚
โ”œโ”€โ”€ telegram/         # Telegram ไธ“็”จๆจกๅ—
โ”‚   โ”œโ”€โ”€ bot.js              # Bot ๅˆ›ๅปบ
โ”‚   โ”œโ”€โ”€ bot-handlers.js     # ๆถˆๆฏๅค„็†ๅ™จ
โ”‚   โ””โ”€โ”€ send.js             # ๆถˆๆฏๅ‘้€
โ”‚
โ”œโ”€โ”€ sessions/         # ๐Ÿ“‹ ไผš่ฏ็ฎก็†
โ”‚   โ””โ”€โ”€ session-key-utils.js
โ”‚
โ”œโ”€โ”€ routing/          # ่ทฏ็”ฑ้€ป่พ‘
โ”‚   โ””โ”€โ”€ session-key.js      # Session Key ๆž„ๅปบ
โ”‚
โ”œโ”€โ”€ config/           # โš™๏ธ ้…็ฝฎ็ฎก็†
โ”‚   โ””โ”€โ”€ config.js
โ”‚
โ”œโ”€โ”€ cli/              # ๅ‘ฝไปค่กŒ็•Œ้ข
โ”‚   โ””โ”€โ”€ program/
โ”‚
โ”œโ”€โ”€ cron/             # โฐ ๅฎšๆ—ถไปปๅŠก
โ”‚
โ””โ”€โ”€ skills/           # ๐ŸŽฏ ๆŠ€่ƒฝ็ณป็ปŸ

ไธƒใ€ๆ€ป็ป“

Clawdbot ็š„ๆžถๆž„ๅฏไปฅ็”จไธ€ๅฅ่ฏๆฆ‚ๆ‹ฌ๏ผš

> ใ€Œๅคšๅ…ฅๅฃใ€ๅ•ๆ ธๅฟƒใ€ๅคšๅทฅๅ…ทใ€

่ฟ™็งๆžถๆž„็š„ไผ˜็‚นๆ˜ฏ๏ผš

1. ๆ˜“ๆ‰ฉๅฑ•๏ผšๆ–ฐๅขžไธ€ไธชๆธ ้“ๅช้œ€่ฆๅ†™ไธ€ไธช Channel ๆ’ไปถ

2. ็ปŸไธ€็ฎก็†๏ผšๆ‰€ๆœ‰ๅฏน่ฏ้ƒฝ้€š่ฟ‡ Session ็ปŸไธ€็ฎก็†

3. ่ƒฝๅŠ›ไธฐๅฏŒ๏ผš้€š่ฟ‡ Tools ็ณป็ปŸ๏ผŒAI ๅ‡ ไนŽๅฏไปฅๅšไปปไฝ•ไบ‹

4. ๅฎ‰ๅ…จๅฏๆŽง๏ผšๅทฅๅ…ท่ฐƒ็”จๆœ‰็ญ–็•ฅๆŽงๅˆถ๏ผŒๆ•ๆ„Ÿๆ“ไฝœ้œ€่ฆๅฎกๆ‰น

ๆŠฅๅ‘Š็”Ÿๆˆๆ—ถ้—ด๏ผš2026-01-28