ๆ ธๅฟๆฐๆฎๆต
ๆฌๆๆกฃ่ฏฆ็ปๆ่ฟฐ Codev ็ๅ ญๅคงๆ ธๅฟๆฐๆฎๆต๏ผๅ ๅซ ASCII ๅบๅๅพๅๅ ณ้ฎไปฃ็ ่ทฏๅพใ
1. ็จๆท่พๅ ฅๆต
็จๆท้่ฟ็ป็ซฏ่พๅ ฅๆๆฌๅฐ AI ๅๅบ็ๅฎๆด้พ่ทฏใ
User (้ฎ็)
โ
โ ้ฎๅ
ฅๆๆฌ + Enter
โผ
PromptInput ็ปไปถ
(screens/PromptInput.tsx)
โ
โ handlePromptSubmit()
โผ
messageQueueManager.enqueue()
(utils/messageQueueManager.ts)
โ
โ ๅฝไปคๅ
ฅ้ (priority: 'now' | 'next' | 'later')
โ FIFO ๆไผๅ
็บงๆๅบ
โผ
useCommandQueue hook
(hooks/useCommandQueue.ts)
โ
โ ๅบ้ โ ไบค็ป REPL ไธปๅพช็ฏ
โผ
query() ๅฝๆฐ
(query.ts โ QueryEngine.ts)
โ
โโโ ็ป่ฃ
ๆถๆฏๅๅฒ
โโโ ่ทๅ็ณป็ปๆ็คบ่ฏ (src/context.ts)
โโโ ๅๅนถๅทฅๅ
ทๅ่กจ (assembleToolPool)
โโโ ้ๆฉ Provider
โ
โโโ [1P Anthropic] โโ Anthropic SDK โโ POST /v1/messages
โ
โโโ [3P Provider] โโ server/proxy/handler.ts
โ
โโโ anthropicToOpenaiChat.ts (่ฏทๆฑ่ฝฌๆข)
โโโ POST provider API (OpenAI/Groq/DeepSeek...)
โโโ openaiChatToAnthropic.ts (ๅๅบ่ฝฌๆข)
โ
โผ
ๆตๅผๅๅบๅๅฐ query()
โ
โผ
ๅทฅๅ
ท่ฐ็จๅๅ (Tool Execution)
โ
โผ
ๆธฒๆๅๅบๅฐ็ป็ซฏ (Ink UI)
ๅ ณ้ฎไปฃ็ ่ทฏๅพ
| ๆญฅ้ชค | ๆไปถ | ๆ ธๅฟๅฝๆฐ |
|---|---|---|
| ่พๅ ฅ | src/components/PromptInput/PromptInput.tsx |
handlePromptSubmit() |
| ้ๅ | src/utils/messageQueueManager.ts |
enqueue(), dequeue() |
| ๆฅ่ฏข | src/query.ts |
query() |
| ๅผๆ | src/QueryEngine.ts |
QueryEngine ็ฑป |
| ๅทฅๅ ท | src/tools.ts |
assembleToolPool(), getTools() |
| ไปฃ็ | src/server/proxy/handler.ts |
handleProxyRequest() |
| ๅๅบๆธฒๆ | src/screens/REPL.tsx |
ๆถๆฏๅ่กจ + ๆตๅผๆธฒๆ |
้ๅไผๅ ็บงๆบๅถ
ไผๅ
็บง: 'now' > 'next' > 'later'
ๅไธไผๅ
็บงๅ
FIFO
โโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโ
โ 'now' โ โ 'next' โ โ 'later' โ
โ (็ดงๆฅ) โ โ (ๆญฃๅธธ) โ โ (้็ฅ) โ
โโโโโโโโโโโค โโโโโโโโโโโโค โโโโโโโโโโโค
โ โโโโถ โ โ โโโโถ โ โ โโโโถ โ
โ ๅบ้ไผๅ
โ โ โ โ โ
โโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโ
2. ่ฏญ้ณๆ่ทๆต
ไป้บฆๅ ้ฃๅฐ VRM ๅ็ซฏ่ฏญ้ณๆญๆพ็ๅฎๆด็ฎก้ใ
่ฏญ้ณๆ่ทๆถๆ
Codev ไฝฟ็จ่ฟ็จๅ
้ณ้ขๆ่ท๏ผcpal Rust ๅบ๏ผ้่ฟ native-modules/audio-capture-napi๏ผ๏ผ่ไธๆฏไผ ็ป็ arecord/parecord ๅญ่ฟ็จใ
้บฆๅ
้ฃ (็กฌไปถ)
โ
โ 16kHz S16LE PCM
โผ
cpal (Rust ๅ็ๆจกๅ)
(native-modules/audio-capture-napi)
โ
โ onData(chunk: Buffer)
โผ
FriendService.startVoiceCapture()
(friend/FriendService.ts)
โ
โโโโถ Silero VAD (่ฏญ้ณๆดปๅจๆฃๆต)
โ (friend/voice/vad-service.ts)
โ โ
โ โ onnxruntime-web WASM ๆจ็
โ โ 512 samples/frame @ 16kHz (32ms)
โ โ
โ โโโ ่ฏด่ฏๅผๅง โ ๅผๅง็งฏ็ดฏ้ณ้ข
โ โโโ ๆฃๆตๆ็ปญ่ฏญ้ณ (โฅ10 ๅธง โ 320ms ๆฟๆดป)
โ โโโ ๆฃๆต้้ณ (โฅ20 ๅธง โ 640ms) โ onSpeechEnd
โ โ
โ โผ
โ ้ณ้ขๆฎต (Float32Array)
โ โ
โ โผ
โ STT (่ฏญ้ณ่ฝฌๆๅญ)
โ โโโ Doubao ASM (็ซๅฑฑๅผๆ)
โ โ (doubaoime-asr ๅ
)
โ โโโ Anthropic STT
โ โโโ Whisper (OpenAI)
โ โ
โ โผ
โ ่ฝฌๅฝๆๆฌ (transcript)
โ
โโโโถ messageQueueManager.enqueue()
โ
โ { value: transcript, mode: 'prompt', origin: { kind: 'channel', server: 'friend' } }
โผ
AI ๅค็ (ๅ็จๆท่พๅ
ฅๆต)
โ
โ AI ๅๅบๆๆฌ
โผ
TTS (ๆๆฌ่ฝฌ่ฏญ้ณ)
โโโ Edge TTS (node-edge-tts, ้ป่ฎค zh-CN-XiaoxiaoNeural)
โโโ Qwen TTS (DashScope API, qwen3-tts-flash)
โ
โ ็ๆ MP3 ๆไปถ
โผ
broadcastToVrm()
(friend/sse.ts)
โ
โ SSE โ { text, audioUrl, audioIndex }
โผ
VRM ๅ็ซฏ
โโโ ๆญๆพ้ณ้ข
โโโ ๆพ็คบๆๆฌๆฐๆณก
โโโ ่งฆๅๅฃๅๅๆญฅ
VAD ็ถๆๆบ
Silero VAD ๅ
้จ็ถๆ:
[้้ณ] โโโโโโโโโโโโโโ ๅธงๆฆ็ < ๆญฃ้ๅผ โโโโโโโโโโโโโโโถ [้้ณ]
โ โฒ
โ ๅธงๆฆ็ โฅ positiveSpeechThreshold โ
โ (่ฟ็ปญ โฅ preSpeechTriggerFrames) โ ๅธงๆฆ็ < ่ด้ๅผ
โผ โ (่ฟ็ปญ โฅ redemptionFrames)
[ๅฏ่ฝ่ฏด่ฏ] โโโโโโ ๅธงๆฆ็ < ๆญฃ้ๅผ โโโโโโโถ [็กฎ่ฎค่ฏด่ฏ] โโโ
โ โ
โ onSpeechStart() โ onSpeechEnd(audio)
โผ โผ
[็งฏ็ดฏ้ณ้ขๅธง] [ๅ้้ณ้ขๆฎตๅฐ STT]
| ๅๆฐ | ้ป่ฎคๅผ | ๅซไน |
|---|---|---|
positiveSpeechThreshold |
0.75 | ๅคๅฎไธบ่ฏญ้ณ็็ฝฎไฟกๅบฆ้ๅผ |
negativeSpeechThreshold |
0.50 | ๅคๅฎไธบ้้ณ็็ฝฎไฟกๅบฆ้ๅผ |
preSpeechTriggerFrames |
10 | ๆฟๆดปๅ้่ฆ่ฟ็ปญ่ฏญ้ณๅธงๆฐ |
redemptionFrames |
20 | ็ปๆๅ้่ฆ่ฟ็ปญ้้ณๅธงๆฐ |
minSpeechFrames |
6 | ๆๅฐๆๆ่ฏญ้ณๅธงๆฐ |
rmsThreshold |
0.004 | RMS ่ฝ้้ๅผ (-48dBFS)๏ผไฝไบๆญคๅผ่ทณ่ฟๆจ็ |
ๅๅฃฐๆถ้คๆบๅถ
FriendService ๅจ TTS ๆญๆพๆถ่ชๅจ้้ณ้บฆๅ
้ฃ:
AI ๅๅบๆๆฌ
โ
โผ
TTS ๅผๅง็ๆ
โ
โผ
friend.muted = true
โ muteTimer = setTimeout(unmute, estimatedTtsDuration)
โ
โผ
TTS ๆญๆพๆ้ด: ้บฆๅ
้ฃๆฐๆฎ โ ไธขๅผ (ไธ้ VAD/STT)
โ
โผ
TTS ๆญๆพ็ปๆ (ๆไผฐ็ฎๆถ้ดๅฐ)
โ
โผ
friend.muted = false
โ
โผ
ๆขๅคๆญฃๅธธๆ่ท
3. ่ฟ็จๆกฅๆฅๆต
Local CLI ๅฐ claude.ai ่ฟ็จไผ่ฏ็ WebSocket ๆกฅๆฅใ
Local CLI (ไฝ ็ๆบๅจ) claude.ai ๆๅกๅจ
โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ
claude --remote start
โ
โผ
bridgeMain()
(bridge/bridgeMain.ts)
โ
โ ๅๅปบๆฌๅฐ HTTP ๆๅก
โ ๅ่ตท OAuth ็ปๅฝ
โผ
WebSocket ่ฟๆฅ
(bridge/replBridgeTransport.ts)
โ โโโโโโโโโโโโบ claude.ai ่ฟ็จไผ่ฏ
โ wss://api.claude.ai/...
โ
โผ
replBridge.ts
โ
โโโ ไป่ฟ็จๆฅๆถ่พๅ
ฅ โ ๅ
ฅ้ๅฐๆฌๅฐ messageQueueManager
โโโ ๅฐๆฌๅฐ่พๅบ/ๅทฅๅ
ท็ปๆ โ ๅ้ๅ่ฟ็จ
โโโ ๅๆญฅๆฌๅฐๅฝไปคๅฐ่ฟ็จ็ฝๅๅ
(BRIDGE_SAFE_COMMANDS)
ๅฝไปค่ฟๆปค
่ฟ็จๆจกๅผไธๅชๅ ่ฎธๅฎๅ จๅฝไปคๆง่ก๏ผ
REMOTE_SAFE_COMMANDS = {
session, // ๆพ็คบ QR/URL
exit, // ้ๅบ
clear, // ๆธ
ๅฑ
help, // ๅธฎๅฉ
theme, // ไธป้ข
color, // ้ข่ฒ
vim, // Vim ๆจกๅผ
cost, // ่ฎก่ดน
usage, // ็จ้
copy, // ๅคๅถ
btw, // ไพฟ็ญพ
feedback, // ๅ้ฆ
plan, // ่ฎกๅๆจกๅผ
keybindings, // ๅฟซๆท้ฎ
statusline, // ็ถๆๆ
stickers, // ่ดด็บธ
mobile, // ็งปๅจ็ซฏ
}
ๆกฅๆฅๅฎๅ จๅฝไปค๏ผไป็งปๅจ็ซฏไนๅฏๆง่ก๏ผ๏ผ
BRIDGE_SAFE_COMMANDS = {
compact, // ๅ็ผฉไธไธๆ
clear, // ๆธ
ๅฑ
cost, // ่ฎก่ดน
summary, // ไผ่ฏๆป็ป
releaseNotes, // ๆดๆฐๆฅๅฟ
files, // ๆไปถๅ่กจ
}
4. Friend ่กจๆ ๆต
LLM ่ฐ็จ friend_emotion ๅทฅๅ
ทๅฐ VRM ๅ็ซฏ 3D ่ง่ฒ่กจๆ
ๆธฒๆ็ๅฎๆด้พ่ทฏใ
LLM ๆจ็
โ
โ ๆ่ไธไธๆๅ่ฐ็จ FriendEmotionTool
โผ
FriendEmotionTool.call({ emotion, intensity, mood_delta })
(tools/FriendEmotionTool.ts)
โ
โโโ ๆดๆฐๅฟๆ
ๆๆฐ moodIndex (0-100, ๅบๅๅผ 60)
โ โโโ mood_delta > 0: moodIndex += delta (ไธ้ 100)
โ โโโ mood_delta < 0: moodIndex -= delta (ไธ้ 0)
โ
โโโ broadcastToVrm({
โ emotion: 'happy'|'sad'|'angry'|...,
โ emotionIntensity: 0..1,
โ moodDelta: n,
โ moodIndex: n
โ })
โ
โผ
broadcastToVrm()
(friend/sse.ts)
โ
โ SSE data: JSON.stringify(payload) + "\n\n"
โ ๅ้็ปๆๆๅทฒ่ฟๆฅ็ SSE ๅฎขๆท็ซฏ
โผ
VRM ๅ็ซฏ (Three.js / React Three Fiber)
โ
โโโ SSE ไบไปถ่งฃๆ
โ
โโโ VRMScene ็ปไปถ
โ โโโ EmoteController โ ่ฎพ็ฝฎ BlendShape ๆททๅๅฝข็ถ
โ โ (happy โ ๅด่งไธๆฌ, sad โ ็็ผไธๅ, ็ญ)
โ โโโ MotionController โ ่งฆๅ็็ๅจ็ป (ๅผๅธใ็จ็ผ)
โ โโโ TextBubble โ ๆพ็คบ่ๅคฉๆๆฌๆฐๆณก
โ
โโโ AudioPlayback (ๅฆๆๆ audioUrl)
โโโ ๆญๆพ TTS ้ณ้ข + ๅฃๅๅๆญฅ
ๅฏ็จ่กจๆ ๅ่กจ
| ่กจๆ | ่ฏดๆ |
|---|---|
happy |
ๅผๅฟ |
sad |
ๆฒไผค |
angry |
็ๆฐ |
surprised |
ๆ่ฎถ |
think |
ๆ่ |
awkward |
ๅฐดๅฐฌ |
question |
็้ฎ |
curious |
ๅฅฝๅฅ |
neutral |
ไธญๆง/้ป่ฎค |
love |
ๅ็ฑ |
flirty |
่ฐๆ |
greeting |
ๆๆๅผ |
relaxed |
ๆพๆพ |
ๅฟๆ ็ณป็ป
ๅฟๆ
ๆๆฐ (moodIndex) ่ๅด 0-100๏ผๅบๅๅผ 60
0 โโโโโโโโโโโโโโ 60 โโโโโโโโโโโโโโ 100
[ไฝ่ฝ] [ไธญๆง] [้ซๆถจ]
ๆฏๆฌก mood_delta: -3 ๅฐ +3 (ๆๅฐ็ปๅฏนๅผ 1)
้่ฟ prefs ๆไน
ๅ (friend/prefs.ts)
moodIndex ๅฝฑๅ:
- ๆๆฌๆฐๆณก้ข่ฒ/ๆ ทๅผ
- ๅๅงฟๅงฟๆ (ๆพๆพ vs ็ดงๅผ )
- ๆ่ๅจไฝๅน
ๅบฆ
SSE ๅนฟๆญไบไปถ็ฑปๅ
Friend SSE ้้้่ฟ broadcastToVrm() ๅ้ JSON ไบไปถ๏ผๆๆๅญๆฎตๅไธบๅฏ้๏ผ
type VrmBroadcastPayload = {
text?: string; // ๆพ็คบๆๆฌ
emotion?: string; // ่กจๆ
ๅ็งฐ
emotionIntensity?: number; // ่กจๆ
ๅผบๅบฆ 0-1
audioUrl?: string; // TTS ้ณ้ข URL
audioIndex?: number; // ้ณ้ขๅบๅๅท
clearText?: boolean; // ๆธ
้คๅฝๅๆๆฌ
imageUrl?: string; // ๆพ็คบ็ๅพ็ URL
moodDelta?: number; // ๅฟๆ
ๅๅ้
moodIndex?: number; // ๅฝๅๅฟๆ
ๆๆฐ
sendFirstTts?: boolean; // ๅ้็ฌฌไธไธช TTS ๆฎต
appendText?: boolean; // ่ฟฝๅ ๅฐๅทฒๆๆๆฌ
replyDone?: boolean; // ๅๅบ็ปๆๆ ่ฎฐ
};
5. Provider ไปฃ็ๆต
CLI ้่ฟ็ปไธๆฅๅฃๅไธๅ LLM Provider ๅ้่ฏทๆฑ็ๅฎๆด่ทฏๅพใ
ๅ่ทฏ็ฑๆถๆ
CLI (Anthropic Messages API format)
โ
โ ้ๆฉ Provider
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Provider ่ทฏ็ฑๅณ็ญ โ
โ โ
โ isFirstPartyAnthropicBaseUrl() โ
โ + isClaudeAISubscriber() โ
โ + !isUsing3PServices() โ
โ โ โ โ
โ ๆฏ/ โ ๅฆ โ
โ โ โ โ
โ โผ โผ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ
โ โ Anthropicโ โ Proxy Handler โ โ
โ โ SDK ็ด่ฟ โ โ (server/proxy/ โ โ
โ โ โ โ handler.ts) โ โ
โ โPOST /v1/ โ โ โ โ
โ โmessages โ โ apiFormat? โ โ
โ โโโโโโโโโโโโ โ โ โ
โ โ โโโ 'openai' โโโถ โ โ
โ โ โ Anthropic โ โ โ
โ โ โ OpenAI Chat โ โ
โ โ โ Completions โ โ
โ โ โ โ โ
โ โ โโโ 'openai- โ โ
โ โ โ responses' โ โ
โ โ โ Anthropic โ โ โ
โ โ โ OpenAI โ โ
โ โ โ Responses API โ โ
โ โ โโโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
่ฏทๆฑ/ๅๅบ่ฝฌๆขๆต็จ
Anthropic Messages API ่ฏทๆฑ
{
model: "claude-3-opus",
messages: [{role: "user", content: "Hello"}],
system: "You are helpful",
max_tokens: 1024,
stream: true
}
โ
โผ
anthropicToOpenaiChat.ts / anthropicToOpenaiResponses.ts
โ
โ ่ฝฌๆข้ป่พ:
โ - system โ system message (prefix)
โ - messages[] โ messages[] (role ๆ ๅฐ)
โ - max_tokens โ max_tokens
โ - stream โ stream
โ - tools โ tools (ๆ ผๅผ้้
)
โ
โผ
OpenAI Chat/Responses API ่ฏทๆฑ
{
model: "gpt-4",
messages: [
{role: "system", content: "You are helpful"},
{role: "user", content: "Hello"}
],
max_tokens: 1024,
stream: true
}
โ
โ POST ๅฐไธๆธธ Provider URL
โผ
OpenAI ๆตๅผๅๅบ
โ
โผ
openaiChatToAnthropic.ts / openaiResponsesToAnthropic.ts (ๆตๅผ)
โ
โ ่ฝฌๆข้ป่พ:
โ - delta.content โ delta.text
โ - tool_calls โ content_block / tool_use
โ - finish_reason โ stop_reason
โ
โผ
Anthropic ๆ ผๅผๆตๅผไบไปถๅ CLI
Provider ้ ็ฝฎ
้่ฟ ProviderService (src/server/services/providerService.ts) ็ฎก็๏ผ
type ProviderConfig = {
id: string;
name: string;
apiFormat: 'openai' | 'openai-responses' | 'anthropic';
baseUrl: string;
apiKey: string;
models: string[];
};
ๆฏๆ็ๅ ็ฝฎ Provider๏ผ้จๅ๏ผ๏ผ
- OpenAI (GPT-4, GPT-4o)
- Groq (Llama, Mixtral)
- DeepSeek
- ่ชๅฎไน OpenAI ๅ ผๅฎน API
ๆฐๆฎๆตๆฑๆปๅพ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็จๆท็่พๅ
ฅๆฅๆบ โ
โโโโโโโฌโโโโโโฌโโโโโโโฌโโโโโโโค
โ้ฎ็ โ่ฏญ้ณ โ่ฟ็จ โ Bot โ
โ โ โWebSocket โ
โโโโฌโโโดโโโฌโโโดโโโฌโโโโดโโโฌโโโ
โ โ โ โ
โผ โ โ โ
โโโโโโโโโโโโ โ โ โ
โ message โโโ โ โ
โ Queue โโโโโโโโโ โ
โ Manager โโโโโโโโโโโโโโโโ
โโโโโโโฌโโโโโ
โ
โผ
โโโโโโโโโโโโ
โ query() โ
โ AI ๅผๆ โ
โโโโฌโโโโโฌโโโ
โ โ
โโโโโโโโโโโโ โโโโโโโโโโโโ
โผ โผ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ
โ Tool ๆง่ก โ โ LLM ๆๆฌๅๅบ โ
โ (Bash/Read/ โ โโโโโโโโโฌโโโโโโโโโ
โ Edit/... โ โ
โโโโโโโโโโโโโโโโ โโโโโโโโโดโโโโโโโโโ
โ ๅๅๅฐๆถ่ดน่
โ
โโโโโโฌโโโโโฌโโโโโโโค
โTUI โTTS โSSE โ
โๆพ็คบ โๆญๆพ โๆจ้ โ
โโโโโโดโโโโโดโโโโโโโ
ๅ่ๆไปถ่ทฏๅพ
| ๆไปถ | ่ฏดๆ |
|---|---|
src/utils/messageQueueManager.ts |
็ปไธๅฝไปค้ๅ |
src/query.ts |
AI ๆฅ่ฏขๅ ฅๅฃ |
src/QueryEngine.ts |
ๆฅ่ฏขๅผๆๅฎ็ฐ |
src/friend/FriendService.ts |
Friend ่ฏญ้ณ/ๆๆฌๆๅก |
src/friend/voice/vad-service.ts |
Silero VAD ๅฎ็ฐ |
src/friend/tts.ts |
Edge TTS / Qwen TTS |
src/friend/sse.ts |
SSE ๅนฟๆญไธๅฎขๆท็ซฏ็ฎก็ |
src/friend/server.ts |
Friend HTTP ๆๅก (Bun.serve) |
src/tools/FriendEmotionTool.ts |
VRM ่กจๆ ๅทฅๅ ท |
src/friend/constants.ts |
ๆ ็ปชๅ่กจๅธธ้ |
src/server/proxy/handler.ts |
Provider ไปฃ็ๅฅๆ |
src/server/proxy/transform/ |
ๅ่ฎฎ่ฝฌๆขๅจ |
src/server/proxy/streaming/ |
ๆตๅผๅๅบ่ฝฌๆข |
src/server/services/providerService.ts |
Provider ้ ็ฝฎ็ฎก็ |
src/bridge/bridgeMain.ts |
่ฟ็จๆกฅๆฅไธปๅ ฅๅฃ |
src/bridge/replBridgeTransport.ts |
WebSocket ไผ ่พๅฑ |
src/bridge/replBridge.ts |
REPL ๆกฅๆฅ้ป่พ |