
Ajan Modu, Memo'ya araç kullanma yeteneği kazandırır — dosyaları okuyabilir, web'de arama yapabilir, kabuk komutları çalıştırabilir, hafızada arama yapabilir ve daha fazlasını gerçekleştirebilir. Ajan, sıkı bir izin sistemiyle kum havuzlu bir ortamda çalışır.
Ajan Modu, işlev çağırma desteğine sahip harici bir sağlayıcı (OpenAI, Claude, Gemini, vb.) gerektirir. Yerel GGUF modelleri henüz ajan araç çağrısını desteklemez.
Ajan, her biri JSON Şema ile tanımlanmış 8 araçla gelir:
| Araç | İşlev | Döndürdüğü |
|---|---|---|
read_file |
Diskteki bir dosyayı oku | String olarak dosya içeriği |
write_file |
Dosya oluştur veya üzerine yaz | Başarı/başarısızlık durumu |
list_directory |
Bir dizindeki dosyaları listele | Dosya girdileri dizisi |
web_search |
Web araması yap | Arama sonucu parçacıkları |
web_fetch |
Bir web sayfasını getir ve ayrıştır | Sayfa metin içeriği |
shell_exec |
Bir kabuk komutu çalıştır | stdout, stderr, çıkış kodu |
memory_search |
RAG vektör hafızada ara | Benzerlik skorlu ilgili parçalar |
memory_store |
RAG hafızaya içerik kaydet | Parça kimliği ve gömme durumu |
{
"name": "shell_exec",
"description": "Kum havuzlu bir ortamda kabuk komutu çalıştır",
"parameters": {
"type": "object",
"properties": {
"command": {
"type": "string",
"description": "Çalıştırılacak kabuk komutu"
},
"working_dir": {
"type": "string",
"description": "Komut için çalışma dizini"
}
},
"required": ["command"]
}
}
Altı izin politikası, araçların nasıl yetkilendirileceğini yönetir:
| Politika | Davranış |
|---|---|
| always_allow | Araç hemen çalışır, onay sorulmaz |
| always_deny | Araç tüm çağrılar için engellenir |
| ask | Her çağrıda kullanıcıya onay sorulur |
| rate_limited | Dakikada maksimum N kez izin verilir (varsayılan 30) |
| sandbox_path | Dosya işlemleri beyaz listeli dizinlerle sınırlıdır |
| command_blacklist | Tehlikeli desenlerle eşleşen kabuk komutları engellenir |
Tehlikeli işlemleri önlemek için 23 desen kabuk yürütmesinden kara listeye alınmıştır:
rm -rf /, dd if=, mkfs., :(){ :|:& };:, chmod 777 /,
curl ... | sh, wget ... | bash, sudo, doas, > /dev/sda,
mv / /dev/null, fork bomb desenleri, /etc/passwd, /etc/shadow,
eval, exec, system, os.system, subprocess, import os, __import__,
nc -l, /proc/sys/, iptables, shutdown, reboot
Dosya işlem araçları yolları bir beyaz listeye karşı doğrular:
var allowedPaths = []string{
filepath.Join(homeDir, "Documents"),
filepath.Join(homeDir, "Downloads"),
filepath.Join(homeDir, "Desktop"),
dataDir, // Memo'nun veri dizini
tmpDir, // Sistem geçici dizini, periyodik temizlenir
}
func validatePath(requested string) (string, error) {
abs, err := filepath.Abs(requested)
if err != nil {
return "", err
}
for _, allowed := range allowedPaths {
if strings.HasPrefix(abs, allowed) {
return abs, nil
}
}
return "", fmt.Errorf("izin verilen dizinlerde değil: %s", requested)
}
Araç çağrıları, tüm araçlar genelinde dakikada 30 istekle sınırlandırılmıştır. Sınırın aşılması bir bekleme süresini tetikler:
type RateLimiter struct {
mu sync.Mutex
window time.Duration // 1 dakika
maxReqs int // 30
counters map[string][]time.Time
}
func (r *RateLimiter) Allow(toolName string) bool {
r.mu.Lock()
defer r.mu.Unlock()
// Kayan pencere zorlaması
cutoff := time.Now().Add(-r.window)
// Pencere içindeki zaman damgalarını filtrele
// Eğer sayı >= maxReqs ise false dön
}
Ajan, yapılandırılabilir bir maksimum ile yinelemeli bir pipeline'da çalışır:
Kullanıcı Sorgusu
│
▼
[Yineleme 1] LLM hangi araç(lar)ın çağrılacağına karar verir
│
├─▶ Araç A çalışır ──▶ Sonuç
│
▼
[Yineleme 2] LLM araç sonuçlarını alır, sonraki adıma karar verir
│
├─▶ Araç B çalışır ──▶ Sonuç
│
▼
...
│
▼
[Yineleme N] LLM nihai yanıtı sentezler
│
▼
Kullanıcı denetim kaydıyla yanıtı alır
| Parametre | Varsayılan | Maksimum |
|---|---|---|
| Maksimum yineleme | 10 | 20 |
| Yineleme başına maksimum araç çağrısı | 3 | 5 |
| Maksimum toplam token | 32K | 128K |
| Hız sınırı | 30/dk | — |
Pipeline şu durumlarda sonlanır:
Her ajan çalıştırması tam bir denetim kaydı üretir:
┌─ Ajan Çalıştırma #1274 ─────────────────────────────┐
│ Model: claude-3.5-sonnet │
│ Başlangıç: 2026-07-04 14:23:01 │
│ Yinelemeler: 4 │
│ │
│ [1] web_search("golang sqlite-vec örneği") │
│ → 3 sonuç (0.8s) │
│ [2] read_file("/home/kullanici/proje/store.go") │
│ → 245 satır (0.02s) │
│ [3] shell_exec("go test ./... -run TestSearch") │
│ → BAŞARISIZ: TestSearch (1.2s) │
│ [4] memory_search("sqlite-vec test hataları") │
│ → 2 parça, benzerlik 0.89, 0.76 (0.05s) │
│ │
│ Nihai yanıt üretildi (toplam 4.3s) │
└───────────────────────────────────────────────────────┘
Denetim kaydı oturumda saklanır ve istenildiği zaman incelenebilir.
Ajan modu, harici sağlayıcının işlev çağırma (araç kullanımı) API'sine dayanır:
| Sağlayıcı | İşlev Çağırma Desteği |
|---|---|
| OpenAI | Yerel (GPT-4o, GPT-4, O-serisi) |
| Anthropic Claude | Yerel (tool_use blokları) |
| Google Gemini | Yerel (function declaration) |
| Groq | Uyumlu modellerle araç kullanımı |
| OpenRouter | Yönlendirilen modele bağlı |
| xAI Grok | Sınırlı |
| Ollama | Hayır (yalnızca yerel modeller) |
Ajan Modu, yerel GGUF modelleri kullanılırken kullanılamaz. Yalnızca yerel sağlayıcı aktif olduğunda sohbet başlığında "Ajan harici sağlayıcı gerektirir" bildirimi görünür. Ajan yeteneklerini etkinleştirmek için harici bir sağlayıcıya geç.