Teknik Derin Dalış
Memo'nun mimarisi ve temel alt sistemlerinin perde arkası incelemesi.
Mimari Genel Bakış
Memo, köprü deseni (bridge pattern) ile iki çalışma zamanından oluşur:
- Go arka uç: llama.cpp sürecini, SQLite kalıcılığını, vektör deposunu, API sunucusunu ve ajan motorunu yönetir.
- Flutter/Web ön uç: Go API'si tarafından sunulan çapraz platform arayüzü sağlar.
Go ikili dosyası, Flutter web derlemesini gömülü olarak barındırır ve API ile birlikte sunar. Masaüstünde Flutter uygulaması, Go ikili dosyasını yardımcı süreç (sidecar) olarak sarar.
SQLite + vec0 Kalıcılığı
Tüm veriler ~/.memo/memo.db yolunda tek bir SQLite veritabanında yaşar:
conversations — mesaj geçmişi ve oturumlar
memories — saklanan olgular ve gömme vektörleri
config — anahtar-değer ayarları
sync_state — bulut senkronizasyon meta verisi
vec0 eklentisi, vektör dizinine güç verir. Gömmeler BLOB olarak saklanır ve kosinüs benzerliği ile sorgulanır. SQLite vec0 eklentisinin kullanılamadığı durumlarda Go yerel kosinüs mesafesi yedeği devreye girer; bu sayede tüm platformlarda uyumluluk sağlanır.
Llama Süreç Yaşam Döngüsü
Go arka ucu, llama.cpp sunucusunu bir alt süreç olarak yönetir:
- Başlatma: Llama sunucu ikili dosyası, yapılandırılmış model ve parametrelerle başlatılır.
- Sağlık Kontrolü: Sunucu hazır rapor edene kadar
/health uç noktası 500ms'de bir yoklanır. Zaman aşımı 30 saniyedir.
- Port Yönetimi: Portlar çakışmaları önlemek için dinamik atanır. Rastgele kullanılabilir bir port seçilir ve
--port ile llama sunucusuna iletilir.
- GPU Algılama: Başlangıçta GPU katman varsayılanlarını belirlemek için CUDA/Metal kullanılabilirliği kontrol edilir.
- Temizlik: Kapanışta llama süreci SIGTERM alır ve beklenir. Yanıt vermezse 10 saniye sonra zorla sonlandırma uygulanır.
Çok İşçili Vektör Arama
Yük altında aramaları hızlı tutmak için gömme ve benzerlik hesaplaması bir goroutine havuzu üzerinde çalışır. Her işçi, kilit çakışmasını önlemek için modelin kendi kopyasını tutar. Sorgular bir kanal üzerinden dağıtılır ve sonuçlar tek bir sıralanmış listede birleştirilir.
Uçtan Uca Senkron Stratejisi
Bulut senkronizasyonu sadece eklemeli şifreli günlük kullanır:
- Her değişiklik, cihazdan çıkmadan önce kullanıcının parolasıyla AES-256-GCM ile şifrelenir.
- Sunucu, eklenme sırasına göre yalnızca opak şifreli metin blokları saklar.
- Senkron sırasında istemci yeni girişleri indirir, yerel olarak çözer ve yerel veritabanına birleştirir.
- Çakışma çözümü, monoton artan bir sıra numarası ile mesaj başına son yazan kazanır esasına göre yapılır.
Harici Sağlayıcı Sistemi
Memo, birleşik bir arayüz üzerinden tak-çalıştır LLM sağlayıcılarını destekler:
type Provider interface {
Chat(ctx, messages) (response, error)
Models() ([]Model, error)
ValidateConfig(cfg) error
}
Yerleşik sağlayıcılar (9 adet): OpenAI, Anthropic Claude, Google Gemini, xAI Grok, Groq, OpenRouter, Ollama, OpenCode Zen ve OpenCode Go. Her biri sağlayıcı kaydına eklenir ve api.base_url ile ilgili API anahtarı ayarlanarak seçilir.
Ajan Motoru
Ajan alt sistemi bir işlem hattı (pipeline) etrafında inşa edilmiştir:
- Araç Kaydı — Mevcut araçların merkezi kaydı (dosya sistemi, kabuk, web, takvim). LLM işlev çağrısı için JSON Schema açıklamaları içerir.
- İzin Yöneticisi — Bir ajanın hangi araçları çağırabileceğini kontrol eder. İzinler oturum başına izin ver/reddet listeleriyle kapsamlandırılır.
- Kum Havuzu — Araç yürütmesi kısıtlı bir ortamda çalışır. Dosya erişimi çalışma diziniyle sınırlıdır. Kabuk komutları zaman aşımı kullanır. Ağ çağrıları bir izin listesinden geçer.
- Pipeline — Ajan döngüsü: mesajı al → planla (LLM araçlara karar verir) → yürüt (araçları çağır) → gözlemle (sonuçları yakala) → yanıtla.
Orkestra Modu
Orkestra, birlikte çalışan birden fazla ajanı koordine eder:
- Şef Deseni: Merkezi bir şef ajan, kullanıcının talebini alır, alt görevlere ayırır ve bunları uzman ajanlara atar.
- Roller: Her ajanın, özel sistem yönergesi ve araç seti ile tanımlanmış bir rolü vardır (araştırmacı, kodlayıcı, inceleyici, planlayıcı).
- İlerleme Akışı: Şef, arayüzün gerçek zamanlı işlediği yapılandırılmış ilerleme olayları yayınlar (
planning, delegating, agent_response, merging).