Skip to content

Come funziona

Alessio Casarotto edited this page Oct 20, 2026 · 6 revisions

Mappa di Banana

flowchart TB
  U([Tu]) --> UI
  DC([Discord]) --> BOT[Bot Discord]
  subgraph PC[Il tuo computer - tutto in locale]
    UI[Interfaccia web SvelteKit<br/>chat, temi, comandi /, memoria, progetti]
    BOT
    SRV[llama-server<br/>router, porta 8080]
    subgraph AUX[Servizi ausiliari]
      SEARCH[search_server 8091<br/>ricerca web]
      STORE[store_server 8092<br/>documenti e RAG]
      ACT[actions_server 8093<br/>azioni con conferma]
    end
    subgraph MOD[Modelli GGUF su CPU]
      M1[Qwen3-1.7B default]
      M2[Qwen3-4B]
      M3[Qwen2.5-Omni-3B]
    end
    WS[(Workspace ~/Banana/workspace)]
  end
  UI -->|API OpenAI| SRV
  BOT -->|API OpenAI| SRV
  UI --> SEARCH
  UI --> STORE
  UI -->|dopo il tuo Consenti| ACT
  SRV --> M1
  SRV --> M2
  SRV --> M3
  ACT --> WS
Loading
Componente Pagina
Interfaccia web Interfaccia
Ricerca, documenti, memoria Uso di Banana
Azioni sul computer Azioni sul computer
Bot Discord Discord
Modelli e parametri del server Modelli e prestazioni

Cosa fa

  • Risponde alle domande in locale: nessun dato lascia il computer e non serve internet (dopo il download dei modelli). Solo se attivi il pulsante Web, la tua domanda viene inviata a DuckDuckGo per la ricerca.
  • Parla italiano e si esprime al femminile (è "Banana").
  • Tre modelli selezionabili dalla UI: Qwen3-4B (più capace), Qwen3-1.7B (più veloce) e Qwen2.5-Omni-3B (multimodale).
  • Immagini e audio in ingresso con Qwen2.5-Omni-3B.
  • Documenti locali (RAG): carichi PDF e file di testo e Banana risponde citando file e pagina (pulsante Doc).
  • Ricerca web opzionale (pulsante Web): cerca online e risponde citando le fonti, senza chiavi API.
  • Memoria persistente: ricorda da sola i fatti personali duraturi che le dici e li usa nelle chat successive.
  • Ragionamento attivabile dal menu per tutti i modelli (spento di default per risposte più rapide).
  • Avvio con un clic su macOS: Banana.app.
  • Due modi d'uso:
    • Interfaccia web su http://127.0.0.1:8080, con cronologia delle conversazioni, impostazioni, selettore modello e tema personalizzato blu-oro.
    • Chat da terminale, con il programma ./llm oppure con scripts/run_qwen.sh.

Come funziona

engine/main.cpp  ──────────────►  libllama / libggml  ◄──── llama-server ◄──── browser / Banana.app
(chat da terminale)         (motore llama.cpp)       (API + Web UI)      127.0.0.1:8080
                                   │
                                   ▼
                    modelli .gguf (Qwen3, Qwen2.5-Omni)
  • engine/main.cpp: programma C++ che si collega direttamente alle librerie libllama e libggml. Carica il modello, applica il chat template, genera le risposte token per token e le mostra in streaming.
  • llama.cpp/: copia completa del progetto llama.cpp inclusa nella repo. Fornisce il motore di inferenza e llama-server.
  • llama-server: server locale con API compatibile OpenAI (/v1/chat/completions) e interfaccia web incorporata. Parte in router mode: legge tutti i .gguf presenti nella cartella (e nelle sottocartelle con modello + mmproj) e carica il modello scelto quando serve. Ne tiene in memoria uno alla volta.
  • Interfaccia web: la UI di llama.cpp (SvelteKit, in llama.cpp/tools/ui/), personalizzata: tema in src/app.css, sfondo static/bg-ship.jpg, testi in italiano, nome Banana. I file della UI vengono incorporati nel binario llama-server in fase di compilazione.
  • Memoria (llama.cpp/tools/ui/src/lib/utils/banana-memory.ts): i fatti sono salvati nel localStorage del browser e aggiunti al system prompt di ogni richiesta, insieme all'identità di Banana (italiano, femminile). Dopo ogni risposta, se il messaggio sembra contenere informazioni personali, il modello stesso estrae i fatti duraturi da salvare.
  • search_server.py: servizio locale (127.0.0.1:8091) che interroga DuckDuckGo (HTML, via curl) e restituisce i primi risultati; con /fetch?url= scarica una pagina e ne estrae il testo (per riassumi , solo indirizzi pubblici). Avviato e fermato insieme al server.
  • store_server.py: servizio locale (127.0.0.1:8092) che salva memoria, progetti e documenti anche in ~/Banana/data/ (memory.json, projects.json, docs.json); avviato e fermato insieme al server, accetta solo richieste dalla UI locale.
  • Documenti (RAG) (llama.cpp/tools/ui/src/lib/utils/banana-docs.svelte.ts): i file caricati vengono spezzati in estratti da ~700 caratteri e salvati nel browser (IndexedDB). A ogni domanda una ricerca BM25 per parole chiave, senza modelli di embedding, sceglie gli estratti più pertinenti, che vengono aggiunti al prompt.
  • Banana.app: generata da scripts/make_app.sh. Avvia il server, apre una finestra Chrome dedicata e spegne il server quando la finestra viene chiusa.
  • engine/src/ e engine/include/: tokenizer, matrici e transformer scritti da zero (progetto iniziale). Non vengono più usati per l'inferenza.
  • web/index.html: prima pagina web sperimentale, non usata dal server attuale.

Clone this wiki locally