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()` ๅ‡ฝๆ•ฐๅฎž็Žฐ็ผ–่ฏ‘ๆœŸๆญปไปฃ็ ๆถˆ้™ค๏ผš
```typescript
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 โ”‚ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```