MemoDokümantasyon
TR

Ajan Modu

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.

Yerleşik Araçlar

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

Araç Şema Örneği

{
  "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"]
  }
}

İzin Sistemi

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

Komut Kara Listesi

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

Güvenlik Kum Havuzu

Yol Doğrulama

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)
}

Hız Sınırlama

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
}

Pipeline Yürütme

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

Pipeline Sınırları

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:

  • LLM nihai bir yanıt döndürür (daha fazla araç çağrısı yok)
  • Maksimum yineleme sayısına ulaşılır
  • Bir araç ölümcül hata döndürür
  • Kullanıcı işlemi iptal eder

Denetim Kaydı

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.

Sağlayıcı Gereksinimi

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ç.