Luna adalah asisten suara lokal dengan antarmuka web real-time, fokus pada percakapan natural (ID input, JP response), tool use (web/news/vision), dan memory persisten.
Dokumen ini dirancang sebagai panduan operasional lengkap: setup, arsitektur, runbook, troubleshooting, dan referensi endpoint.
- Real-time WebSocket orchestration antara frontend dan backend.
- Speech-to-Text input dari browser (speech recognition).
- Response TTS menggunakan VoiceVox (server lokal) untuk playback web.
- Tool pipeline: web search, news summary, vision capture, time, reminder, IoT.
- STM/LTM memory untuk konteks percakapan berkelanjutan.
- UI modern berbasis React + Vite + Zustand + Motion.
- Backend: FastAPI, Uvicorn, Python async pipeline.
- Frontend: React 19, Vite, TypeScript, Tailwind, Motion.
- LLM runtime: Ollama (default model llama3.1).
- Vision model: Ollama moondream.
- TTS: VoiceVox engine (localhost:50021).
- Search: ddgs.
luna/
|- backend/
| |- api.py # FastAPI app, WS events, runtime checks, audio serving
| |- generated_audio/ # Cached/generated wav for web playback
|- web/
| |- src/
| | |- App.tsx # Main layout + runtime dependency polling
| | |- hooks/useLunaWebSocket.ts
| | |- components/ # Orb, CommandBar, ContextWindow, panels, popup
|- agent_tools/
| |- web_tools.py # Web search helpers
| |- news_tools.py # News retrieval/summarization helpers
| |- vision_tool.py # Camera capture + image describe
| |- detectors.py # Intent/tool detection
|- memory/
| |- short_term.json
| |- long_term.json
| |- active_topic.json
| |- memory_manager.py
|- tts/
| |- voicevox.py # VoiceVox integration
|- stt/
| |- stt.py
|- iot/
| |- mqtt_client.py
| |- iot_controller.py
|- mjp.py # Main orchestration and tool registry
|- requirements.txt
|- scripts/
| |- start_luna.ps1
| |- start_luna_minimal.ps1
- User input dikirim dari frontend (chat text atau voice transcript).
- Frontend mengirim event
chatke backend lewat WebSocketws://localhost:8000/ws. - Backend mendeteksi tool (jika ada), mengelola memory context, menjalankan LLM/tool.
- Backend broadcast event progres (
tool_start,tts_start,search_results,tool_end, dst). - Untuk audio, backend generate file wav melalui VoiceVox lalu kirim event
tts_audio. - Frontend memutar audio dari endpoint
/audio/{filename}.
- Windows 10/11 (rekomendasi, sesuai script PowerShell tersedia).
- Conda environment aktif (default:
lunaproject). - Python + package di
requirements.txt. - Node.js 18+.
- Ollama aktif di localhost:11434.
- VoiceVox engine/container aktif di localhost:50021.
conda activate lunaproject
pip install -r requirements.txtJika environment Python Anda masih < 3.10, pasang kompatibilitas typing untuk Pydantic:
pip install eval_type_backportcd web
npm installMenjalankan VoiceVox (docker start), Ollama model, backend, dan frontend dalam terminal terpisah.
powershell -ExecutionPolicy Bypass -File .\scripts\start_luna.ps1Dengan parameter custom:
powershell -ExecutionPolicy Bypass -File .\scripts\start_luna.ps1 -CondaEnv lunaproject -OllamaModel llama3.1 -VoicevoxContainer voicevoxMenjalankan backend + frontend saja.
powershell -ExecutionPolicy Bypass -File .\scripts\start_luna_minimal.ps1- Backend:
conda activate lunaproject
python -m uvicorn backend.api:app --host 0.0.0.0 --port 8000 --reload- Frontend:
cd web
npm run dev- Buka URL Vite yang aktif (biasanya
http://localhost:3000, atau fallback3001/3002jika port terpakai).
Frontend:
VITE_LUNA_WS_URLdefault:ws://localhost:8000/wsVITE_LUNA_DEMO_MODEdefault:false
Contoh di PowerShell sebelum npm run dev:
$env:VITE_LUNA_WS_URL = "ws://localhost:8000/ws"
$env:VITE_LUNA_DEMO_MODE = "false"HTTP endpoints:
GET /runtime/depscek status VoiceVox dan Ollama.POST /chatchat request/response mode HTTP.GET /audio/{filename}serve file audio wav untuk frontend.
WebSocket endpoint:
ws://localhost:8000/ws
Event yang umum dipakai frontend:
stttool_start/tool_endtts_start/tts_audio/tts_end/tts_audio_errorsearch_resultsvision_framesystem_stats
- Web Search: cari topik umum dan rangkum hasil.
- News Search: headline + artikel utama + rangkuman.
- Vision: capture kamera dan deskripsi gambar.
- Time Tool: waktu/tanggal lokal.
- Reminder Tool: pengingat lokal.
- IoT Tool: kontrol perangkat via MQTT.
- STM: konteks percakapan jangka pendek.
- LTM: fakta/preferensi yang disimpan lintas sesi.
- Active Topic: konteks artikel/topik terbaru untuk follow-up question.
Semua data disimpan di folder memory/ dalam format JSON.
- Sistem web sekarang menggunakan VoiceVox-only playback untuk output suara.
- Jika VoiceVox tidak aktif, teks masih bisa muncul, tetapi audio TTS tidak diputar.
- Untuk vision, kamera diberi warm-up delay sebelum capture agar hasil lebih fokus.
Kemungkinan port sudah dipakai proses lama.
Get-NetTCPConnection -LocalPort 8000 | Select-Object LocalAddress,LocalPort,State,OwningProcess
Stop-Process -Id <PID> -ForceGunakan module mode setelah activate conda env:
conda activate lunaproject
python -m uvicorn backend.api:app --host 0.0.0.0 --port 8000 --reloadChecklist:
- Backend hidup di
:8000. VITE_LUNA_WS_URLmengarah ke endpoint benar.- Tidak ada firewall policy yang memblokir localhost.
Checklist:
- Container/engine VoiceVox berjalan di
http://localhost:50021. - Endpoint
GET /runtime/depsmengembalikanvoicevox.ok = true. - Browser mengizinkan autoplay audio untuk situs localhost.
Backend sanity:
conda activate lunaproject
python -m py_compile backend\api.py agent_tools\vision_tool.pyFrontend:
cd web
npm run lint
npm run build- Tambahkan
.env.exampleroot untuk endpoint/model defaults. - Tambahkan health dashboard endpoint untuk observability.
- Tambahkan integration test sederhana untuk event WebSocket utama.