codev / docs /architecture /overview.md
chenbhao's picture
chore: rename VersperClaw to Codev, update org to chenbhao
96f34e3
|
Raw
History Blame Contribute Delete
14.7 kB

้กน็›ฎๆžถๆž„ๆฆ‚่งˆ

้กน็›ฎๅฎšไฝ

Codev ๆ˜ฏไธ€ไธช AI CLI ๆ™บ่ƒฝไปฃ็†๏ผŒๅŸบไบŽ Anthropic Claude Code ๆบไปฃ็ ๆž„ๅปบ๏ผŒๅขžๅผบไบ†ๅฏนไปฅไธ‹ๅœบๆ™ฏ็š„ๆ”ฏๆŒ๏ผš

  • VRM ๆกŒ้ขไผดไพฃ๏ผˆFriend๏ผ‰๏ผšๅœจๅŒไธ€่ฟ›็จ‹ไธญ่ฟ่กŒ HTTP/SSE ๆœๅŠก๏ผŒ้ฉฑๅŠจ 3D VRM ่ง’่‰ฒ็š„่กจๆƒ…ใ€่ฏญ้Ÿณๅ’Œๆ–‡ๆœฌๆฐ”ๆณก
  • ๅคšๆจกๅž‹ๆไพ›่€…๏ผš้€š่ฟ‡ๅๅ‘ไปฃ็†ๅฑ‚ๅฐ† Anthropic Messages API ๅ่ฎฎ็ฟป่ฏ‘ไธบ OpenAI Chat/Responses API ๅ่ฎฎ๏ผŒๆ”ฏๆŒๆ•ฐๅ็ง็ฌฌไธ‰ๆ–นๆจกๅž‹
  • ่ฏญ้Ÿณๅฏน่ฏ๏ผšๅŸบไบŽ cpal๏ผˆRust ๅŽŸ็”Ÿ้Ÿณ้ข‘ๅบ“๏ผ‰็š„่ฟ›็จ‹ๅ†…้Ÿณ้ข‘ๆ•่Žท๏ผŒ็ป“ๅˆ Silero VAD๏ผˆONNX ๅฎžๆ—ถ่ฏญ้ŸณๆดปๅŠจๆฃ€ๆต‹๏ผ‰ๅ’Œๅคš็ง STT/TTS ๅผ•ๆ“Ž
  • ่‡ชๅŠจๅŒ–ๆจกๅผ๏ผš็›ฎๆ ‡็ณป็ปŸ๏ผˆGoals๏ผ‰ใ€ๅŽๅฐไปปๅŠก๏ผˆBackground Tasks๏ผ‰ใ€MCP ๅทฅๅ…ท้›†ๆˆใ€Feishu/Telegram Bot ๆกฅๆŽฅ

ๆŠ€ๆœฏๆ ˆ

็ฑปๅˆซ ๆŠ€ๆœฏ
่ฟ่กŒๆ—ถ **Bun 1.3+**๏ผˆJavaScript/TypeScript ่ฟ่กŒๆ—ถไธŽๆ‰“ๅŒ…ๅ™จ๏ผ‰
่ฏญ่จ€ TypeScript๏ผˆๅ…จไป“ๅบ“ไฝฟ็”จ strict ๆจกๅผ๏ผ‰
็ปˆ็ซฏ UI Ink v6๏ผˆReact ็ปˆ็ซฏๆธฒๆŸ“ๆก†ๆžถ๏ผ‰+ React 19
3D ๆธฒๆŸ“ Three.js๏ผˆVRM ๅ‰็ซฏไฝฟ็”จ๏ผŒ้€š่ฟ‡ {React} Three Fiber๏ผ‰
่ฏญ้ŸณๆดปๅŠจๆฃ€ๆต‹ onnxruntime-web (WASM) โ€” Silero VAD ONNX ๆจกๅž‹๏ผˆ้ž onnxruntime-node๏ผŒ้ฟๅ… Bun ๆฎต้”™่ฏฏ๏ผ‰
ๆกŒ้ข็ช—ๅฃ Tauri๏ผˆๅฏ้€‰ๆกŒ้ข็ช—ๅฃๆจกๅผ๏ผ‰
ๅŒ…็ฎก็† Bun workspace๏ผˆmonorepo๏ผ‰๏ผŒpackageManager: bun@1.3.11
ๆž„ๅปบ Bun ๅ†…ๅปบๆ‰“ๅŒ… scripts/build.ts๏ผŒๆ”ฏๆŒ feature() ๆญปไปฃ็ ๆถˆ้™ค

ๅ…ฅๅฃๆต็จ‹

cli.tsx (bootstrap)
    โ”‚
    โ–ผ
main.tsx (Commander CLI ๅฎšไน‰)
    โ”‚  โ”œโ”€โ”€ ๆณจๅ†Œ ~180+ ๅ‘ฝไปค๏ผˆcommands.ts โ†’ command modules๏ผ‰
    โ”‚  โ””โ”€โ”€ ๆณจๅ†Œ ~60+ AI ๅทฅๅ…ท๏ผˆtools.ts โ†’ tool modules๏ผ‰
    โ”‚
    โ–ผ
replLauncher.tsx
    โ”‚
    โ–ผ
Ink REPL (screens/REPL.tsx)
    โ”œโ”€โ”€ PromptInput๏ผˆๆ–‡ๆœฌ่พ“ๅ…ฅ็ป„ไปถ๏ผ‰
    โ”œโ”€โ”€ messageQueueManager๏ผˆ็ปŸไธ€ๅ‘ฝไปค้˜Ÿๅˆ—๏ผ‰
    โ”œโ”€โ”€ query.ts๏ผˆAI ่ฏทๆฑ‚ๅˆ†ๅ‘๏ผ‰
    โ””โ”€โ”€ useMergedTools๏ผˆๅทฅๅ…ทๆฑ ่ฃ…้…๏ผ‰

ๅฏๅŠจ้˜ถๆฎต่ฏฆ่งฃ

  1. src/entrypoints/cli.tsx โ€” ๆœ€ๅค–ๅฑ‚ๅ…ฅๅฃใ€‚ๅ…ˆๆ‰ซๆ --version/-vใ€--dump-system-promptใ€--bridgeใ€--daemonใ€--tmux ็ญ‰ๅฟซ้€Ÿ่ทฏๅพ„ๆ ‡ๅฟ—ใ€‚่‹ฅๆ— ๅŒน้…ๅˆ™ๅŠจๆ€ๅฏผๅ…ฅ main.tsx ๅนถ่ฐƒ็”จ cliMain()ใ€‚
  2. src/main.tsx โ€” ๆž„ๅปบ Commander CLI ๅฎšไน‰๏ผˆ็บฆ 180+ ๅ‘ฝไปค๏ผ‰ใ€‚ๆ‰ง่กŒ้…็ฝฎๅŠ ่ฝฝใ€็ญ–็•ฅๆฃ€ๆŸฅใ€้ฅๆต‹ๅˆๅง‹ๅŒ–ใ€ไผš่ฏๆขๅค็ญ‰ใ€‚ๆœ€ๅŽ่ฐƒ็”จ launchRepl() ๆธฒๆŸ“็ปˆ็ซฏ UIใ€‚
  3. src/replLauncher.tsx โ€” ่ดŸ่ดฃๅŠจๆ€ๅŠ ่ฝฝ <App> ๅ’Œ <REPL> ็ป„ไปถๅนถ่ฐƒ็”จ renderAndRun()ใ€‚
  4. src/screens/REPL.tsx โ€” ไธป REPL ๅฑๅน•๏ผŒๅŒ…ๅซๆถˆๆฏๅކๅฒใ€PromptInputใ€ๅทฅๅ…ท่ฐƒ็”จๆธฒๆŸ“็ญ‰ใ€‚

ๆžถๆž„ไบฎ็‚น

1. ๅŒ่ฟ›็จ‹ๆžถๆž„

Friend VRM ๆœๅŠกไธŽ CLI ่ฟ่กŒๅœจๅŒไธ€ Bun ่ฟ›็จ‹ไธญ๏ผš

  • friend/server.ts ้€š่ฟ‡ Bun.serve() ็›‘ๅฌ 127.0.0.1:3456
  • SSE๏ผˆServer-Sent Events๏ผ‰็”จไบŽๆœๅŠก็ซฏๅˆฐ VRM ๅ‰็ซฏ็š„ๅฎžๆ—ถๆŽจ้€๏ผˆ่กจๆƒ…ใ€้Ÿณ้ข‘ใ€ๆ–‡ๆœฌๆฐ”ๆณก๏ผ‰
  • HTTP POST ็”จไบŽ VRM ๅ‰็ซฏๅ‘ FriendService ๅ‘้€ๆถˆๆฏ
  • ๆถˆ้™คไบ†็‹ฌ็ซ‹็š„ๅญ่ฟ›็จ‹็ฎก็†ๅ’Œ CLI SDK ไผš่ฏ็š„ๅผ€้”€

2. ๆจกๅ—ๅŒ–ๅทฅๅ…ท็ณป็ปŸ

60+ AI ๅฏ่ฐƒ็”จๅทฅๅ…ท้€š่ฟ‡ buildTool() ๆก†ๆžถๆณจๅ†Œใ€‚ๆ ธๅฟƒๅทฅๅ…ทๅŒ…ๆ‹ฌ๏ผš

  • ๆ–‡ไปถๆ“ไฝœ: BashTool, FileReadTool, FileEditTool, FileWriteTool, GlobTool, GrepTool
  • Web/ๆœ็ดข: WebFetchTool, WebSearchTool
  • ไปปๅŠก็ฎก็†: TaskCreateTool, TaskGetTool, TaskUpdateTool, TaskListTool, TaskStopTool
  • MCP: ListMcpResourcesTool, ReadMcpResourceTool
  • Friend ็‰นๆœ‰: FriendEmotionTool๏ผˆVRM ่กจๆƒ… + ๅฟƒๆƒ…็ฎก็†๏ผ‰, FriendScreenObserveTool
  • ็›ฎๆ ‡็ณป็ปŸ: GoalCreateTool, GoalGetTool, GoalUpdateTool
  • ๅทฅไฝœๆต: WorkflowTool๏ผˆ้€š่ฟ‡ WORKFLOW_SCRIPTS feature flag๏ผ‰
  • ๅ…ถไป–: AgentTool, SkillTool, TodoWriteTool, ToolSearchTool, ConfigTool ็ญ‰

ๅทฅๅ…ท้€š่ฟ‡ assembleToolPool() ไธŽ MCP ๅทฅๅ…ทๅˆๅนถๅŽป้‡๏ผŒ็ปŸไธ€ๆไพ›็ป™ AI ๆจกๅž‹ใ€‚

3. ๅคš Provider ไปฃ็†

src/server/proxy/handler.ts ๅฎž็Žฐๅ่ฎฎ็ฟป่ฏ‘ๅๅ‘ไปฃ็†๏ผš

  • ่พ“ๅ…ฅ: CLI ไปฅ Anthropic Messages API ๆ ผๅผๅ‘้€่ฏทๆฑ‚ๅˆฐ POST /proxy/v1/messages ๆˆ– POST /proxy/providers/:id/v1/messages
  • ่ฝฌๆข: anthropicToOpenaiChat.ts / anthropicToOpenaiResponses.ts ๅฐ†่ฏทๆฑ‚ไฝ“็ฟป่ฏ‘ไธบ OpenAI ๆ ผๅผ
  • ่ฝฌๅ‘: ๅ‘้€ๅˆฐไธŠๆธธ็ฌฌไธ‰ๆ–นๆไพ›ๅ•†็š„ API
  • ๅ›žไผ : openaiChatToAnthropic.ts / openaiResponsesToAnthropic.ts ๅฐ†ๅ“ๅบ”็ฟป่ฏ‘ๅ›ž Anthropic ๆ ผๅผ
  • ๆตๅผ: ๆ”ฏๆŒ SSE ๆตๅผๅ“ๅบ”็š„ๅŒๅ‘่ฝฌๆข๏ผˆopenaiChatStreamToAnthropic.ts / openaiResponsesStreamToAnthropic.ts๏ผ‰

4. Feature Flag ็ณป็ปŸ

้€š่ฟ‡ bun:bundle ็š„ feature() ๅ‡ฝๆ•ฐๅฎž็Žฐ็ผ–่ฏ‘ๆœŸๆญปไปฃ็ ๆถˆ้™ค๏ผš

import { feature } from 'bun:bundle'

// ไปฅไธ‹ไปฃ็ ๅœจ้ž KAIROS ๆž„ๅปบไธญ่ขซๅฎŒๅ…จๆถˆ้™ค
const assistantModule = feature('KAIROS')
  ? require('./assistant/index.js')
  : null

ๅทฒๅฎšไน‰็š„ feature flags๏ผˆ้ƒจๅˆ†๏ผ‰๏ผšVOICE_MODE, KAIROS, DAEMON, BRIDGE_MODE, COORDINATOR_MODE, PROACTIVE, AGENT_TRIGGERS, MCP_SKILLS, WORKFLOW_SCRIPTS, BUDDY, FORK_SUBAGENT, MONITOR_TOOL, WEB_BROWSER_TOOL, TERMINAL_PANEL ็ญ‰ใ€‚

ๆ ธๅฟƒๆจกๅ—ไธ€่งˆ

็›ฎๅฝ• ่Œ่ดฃ
src/entrypoints/ ็จ‹ๅบๅ…ฅๅฃ็‚น๏ผˆcli.tsx bootstrap, init.ts ๅˆๅง‹ๅŒ–๏ผ‰
src/main.tsx Commander CLI ๅฎšไน‰ใ€ๅฏๅŠจๆต็จ‹็ผ–ๆŽ’
src/commands/ 180+ ๆ–œๆ ๅ‘ฝไปค๏ผˆ/clear, /commit, /config, /friend ็ญ‰๏ผ‰
src/commands.ts ๅ‘ฝไปคๆณจๅ†Œไธญๅฟƒ๏ผŒไปŽๅ„ๆจกๅ—ๅŠ ่ฝฝๅนถๅฏผๅ‡บๅ‘ฝไปคๅˆ—่กจ
src/tools/ 60+ AI ๅทฅๅ…ทๅฎž็Žฐ๏ผˆBash, Read, Edit, WebSearch, FriendEmotion ็ญ‰๏ผ‰
src/tools.ts ๅทฅๅ…ทๆณจๅ†Œไธญๅฟƒ๏ผŒgetAllBaseTools() ไธŽ assembleToolPool()
src/ink/ Ink ็ปˆ็ซฏๆธฒๆŸ“ๅผ•ๆ“Ž๏ผˆ่‡ชๅฎšไน‰ fork๏ผŒๅŒ…ๅซ reconcilerใ€layoutใ€renderer ็ญ‰๏ผ‰
src/screens/ ไธป่ฆ UI ๅฑๅน•๏ผˆREPL ไธปๅฑๅน•ใ€่ฎพ็ฝฎๅ‘ๅฏผ็ญ‰๏ผ‰
src/components/ React ็ป„ไปถ๏ผˆApp, PromptInput, ๆƒ้™่ฏทๆฑ‚็ญ‰๏ผ‰
src/hooks/ React hooks๏ผˆuseMergedTools, useCommandQueue, useReplBridge ็ญ‰๏ผ‰
src/friend/ VRM ๆกŒ้ขไผดไพฃๆœๅŠก๏ผˆFriendService, SSE, TTS, VAD, STT๏ผ‰
src/server/ HTTP/WebSocket ๆœๅŠกๅ™จ๏ผˆAPI ่ทฏ็”ฑใ€Provider ไปฃ็†ใ€MCPใ€H5 ่ฎฟ้—ฎ๏ผ‰
src/server/proxy/ ๅคš Provider ๅๅ‘ไปฃ็†๏ผˆๅ่ฎฎ็ฟป่ฏ‘๏ผšAnthropic โ†” OpenAI๏ผ‰
src/bridge/ ่ฟœ็จ‹ๆกฅๆŽฅ๏ผˆWebSocket โ†” claude.ai ่ฟœ็จ‹ไผš่ฏ๏ผ‰
src/query/ AI ่ฏทๆฑ‚ๆŸฅ่ฏขๅผ•ๆ“Ž๏ผˆquery.tsใ€QueryEngine.ts๏ผ‰
src/context/ ็ณป็ปŸไธŠไธ‹ๆ–‡ๆž„ๅปบ๏ผˆcontext.ts๏ผŒ็”Ÿๆˆ็ณป็ปŸๆ็คบ่ฏ๏ผ‰
src/services/ ๅŽ็ซฏๆœๅŠก๏ผˆAPI client, Analytics, MCP, PolicyLimits, Compact ็ญ‰๏ผ‰
src/utils/ ๅทฅๅ…ทๅ‡ฝๆ•ฐ๏ผˆ้…็ฝฎใ€่ฎค่ฏใ€ๆถˆๆฏ้˜Ÿๅˆ—ใ€ๆƒ้™ใ€MCP ๆ’ไปถใ€่ฎพ็ฝฎ็ญ‰๏ผ‰
src/state/ ๅบ”็”จ็Šถๆ€็ฎก็†๏ผˆAppStateStore๏ผ‰
src/types/ TypeScript ็ฑปๅž‹ๅฎšไน‰
src/constants/ ๅธธ้‡๏ผˆOAuthใ€ไบงๅ“ๅใ€ๆ็คบ่ฏใ€ๅทฅๅ…ทๅฎšไน‰็ญ‰๏ผ‰
src/voice/ ่ฏญ้Ÿณๆจกๅผๅ…ฅๅฃ๏ผˆvoiceModeEnabled.ts๏ผ‰
src/assistant/ ๅŠฉๆ‰‹ๆจกๅผ๏ผˆKAIROS feature flag ๅฎˆๆŠค๏ผ‰
src/coordinator/ ๅ่ฐƒๅ™จๆจกๅผ๏ผˆๅคš agent ๅไฝœ๏ผ‰
src/buddy/ Buddy ๅญ agent ็ณป็ปŸ๏ผˆBUDDY feature flag๏ผ‰
src/daemon/ ๅฎˆๆŠค่ฟ›็จ‹ๆจกๅผ๏ผˆ้•ฟๆœŸ่ฟ่กŒ็š„ๅŽๅฐๆœๅŠก๏ผ‰
src/plugins/ ๆ’ไปถ็ณป็ปŸ๏ผˆๆ’ไปถๅ‘็Žฐใ€ๅŠ ่ฝฝใ€็”Ÿๅ‘ฝๅ‘จๆœŸ๏ผ‰
src/skills/ ๆŠ€่ƒฝ็ณป็ปŸ๏ผˆ็”จๆˆท่‡ชๅฎšไน‰ prompt ๅผๅ‘ฝไปค๏ผ‰
src/tasks/ ไปปๅŠก็ณป็ปŸ๏ผˆLocalAgentTask, LocalShellTask, RemoteAgentTask ็ญ‰๏ผ‰
src/cli/ CLI ๅทฅๅ…ท๏ผˆbg.ts ๅŽๅฐไผš่ฏ็ฎก็†ใ€templateJobs ๆจกๆฟไปปๅŠก๏ผ‰
src/bootstrap/ ๅฏๅŠจ็Šถๆ€๏ผˆstate.ts ๅฏผๅ…ฅๅ‰็Šถๆ€่ฎพ็ฝฎ๏ผ‰
src/config/ ้…็ฝฎๅค„็†
src/vim/ Vim ๆจกๅผๆ”ฏๆŒ
src/migrations/ ๆ•ฐๆฎ่ฟ็งป
src/memdir/ ่ฎฐๅฟ†็›ฎๅฝ•ๆ”ฏๆŒ
src/upstreamproxy/ ไธŠๆธธไปฃ็†ๆ”ฏๆŒ
src/remote/ ่ฟœ็จ‹ๆŽงๅˆถๆ”ฏๆŒ
native-modules/ Rust/C++ ๅŽŸ็”Ÿๆจกๅ—๏ผˆcpal ้Ÿณ้ข‘ๆ•่Žท็ญ‰๏ผ‰

ๆ•ฐๆฎๆตๆ€ป่งˆ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         CLI ่ฟ›็จ‹ (Bun)                               โ”‚
โ”‚                                                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ cli.tsx  โ”‚โ”€โ”€โ”€โ–ถโ”‚  main.tsx โ”‚โ”€โ”€โ”€โ–ถโ”‚  REPL.tsx โ”‚โ”€โ”€โ”€โ–ถโ”‚ PromptInput โ”‚  โ”‚
โ”‚  โ”‚ (bootstrap)  โ”‚ (Commander)    โ”‚ (Ink UI)  โ”‚    โ”‚ (่พ“ๅ…ฅๆก†)    โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                                         โ”‚                  โ”‚        โ”‚
โ”‚                                         โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚                                         โ”‚     โ”‚ messageQueue    โ”‚  โ”‚
โ”‚                                         โ”‚     โ”‚ Manager.enqueue โ”‚  โ”‚
โ”‚                                         โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                                         โ”‚              โ”‚           โ”‚
โ”‚                                         โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚                                         โ”‚     โ”‚   query()       โ”‚  โ”‚
โ”‚                                         โ”‚     โ”‚ (AI ่ฏทๆฑ‚)      โ”‚  โ”‚
โ”‚                                         โ”‚     โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                                         โ”‚        โ”‚    โ”‚            โ”‚
โ”‚                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚            โ”‚
โ”‚                    โ”‚                    โ”‚             โ”‚            โ”‚
โ”‚                    โ–ผ                    โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”‚    โ”‚  Tool Execution  โ”‚  โ”‚
โ”‚  โ”‚ Anthropic SDK (1P)      โ”‚           โ”‚    โ”‚ (Bash/Read/Edit  โ”‚  โ”‚
โ”‚  โ”‚ POST /v1/messages       โ”‚           โ”‚    โ”‚  ...็ญ‰ ~60 ๅทฅๅ…ท) โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                    โ”‚                    โ”‚                          โ”‚
โ”‚         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚                          โ”‚
โ”‚         โ”‚  server/proxy/      โ”‚        โ”‚                          โ”‚
โ”‚         โ”‚  handler.ts         โ”‚        โ”‚                          โ”‚
โ”‚         โ”‚  (3P Provider ไปฃ็†) โ”‚        โ”‚                          โ”‚
โ”‚         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚                          โ”‚
โ”‚                    โ”‚                   โ”‚                          โ”‚
โ”‚                    โ–ผ                   โ”‚                          โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚                          โ”‚
โ”‚  โ”‚ OpenAI Chat/Responses API    โ”‚      โ”‚                          โ”‚
โ”‚  โ”‚ (OpenAI/Groq/DeepSeek ็ญ‰)    โ”‚      โ”‚                          โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚                          โ”‚
โ”‚                                         โ”‚                          โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”‚
โ”‚  โ”‚  FriendService (ๅŒ่ฟ›็จ‹)              โ”‚              โ”‚           โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚           โ”‚
โ”‚  โ”‚  โ”‚ Silero  โ”‚  โ”‚ STT      โ”‚  โ”‚  SSE Server  โ”‚      โ”‚           โ”‚
โ”‚  โ”‚  โ”‚ VAD     โ”‚โ”€โ”€โ”‚ (Doubao/ โ”‚  โ”‚  :3456       โ”‚      โ”‚           โ”‚
โ”‚  โ”‚  โ”‚ (ONNX)  โ”‚  โ”‚ Whisper) โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚           โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚              โ”‚           โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚              โ”‚           โ”‚
โ”‚  โ”‚  โ”‚ TTS     โ”‚  โ”‚ EdgeTTS/ โ”‚         โ”‚              โ”‚           โ”‚
โ”‚  โ”‚  โ”‚ Audio   โ”‚โ”€โ”€โ”‚ QwenTTS  โ”‚         โ”‚              โ”‚           โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚              โ”‚           โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                        โ”‚
                                        โ–ผ
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚  VRM ๅ‰็ซฏ (Web/Desktop)              โ”‚
                  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
                  โ”‚  โ”‚  SSE โ†’ VRMScene โ†’ TextBubble    โ”‚ โ”‚
                  โ”‚  โ”‚        โ†’ EmoteController        โ”‚ โ”‚
                  โ”‚  โ”‚        โ†’ MotionController       โ”‚ โ”‚
                  โ”‚  โ”‚        โ†’ AudioPlayback          โ”‚ โ”‚
                  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
                  โ”‚  HTTP POST โ†’ FriendService.sendText โ”‚ โ”‚
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜