Discord chatbot (long-running proces) postavený na Bun, Discord.js, Vercel AI SDK a Neon + Drizzle.
- Bun (ověř:
bun --version) - Discord aplikace s povoleným Message Content Intent (na Developer Portálu)
- Neon Postgres databáze
- Vytvoř
.envpodle.env.example:
DISCORD_TOKEN: bot tokenDISCORD_APP_ID: application id (client id)OPENAI_API_KEY: OpenAI klíčOPENAI_MODEL: model pro odpovědi (výchozígpt-4o-mini; pro analýzu obrázků z Discord příloh potřebuješ vision model, např.gpt-4o/gpt-4o-mini)OPENAI_MEMORY_MODEL: volitelně jiný model pro extrakci faktů (jinak stejný jakoOPENAI_MODEL)OPENAI_REASONING_EFFORT: volitelně pro reasoning modely (none|minimal|low|medium|high|xhigh). U běžných modelů (gpt-4o-miniatd.) proměnnou nepiš — u reasoning modelů ji nastav podle OpenAI dokumentace (none/xhighjen u vybraných modelů)DATABASE_URL: Neon connection stringLOFEE_CHANNEL_ID: ID kanálu, ve kterém bot odpovídá (v odpovědích podporuje i vlákna pod tímto kanálem)
System prompt se načítá z Markdown souboru prompts/system.md. Volitelně můžeš nastavit LOFEE_SYSTEM_PROMPT_PATH (cesta k jinému .md) nebo LOFEE_SYSTEM_PROMPT jako prosté textové přepsání s nejvyšší prioritou.
- Plný vs. kompaktní prompt: env
LOFEE_FULL_SYSTEM_EVERY_N(výchozí1) určuje, jak často se globálně (jedno počítadlo pro celý bot – všichni uživatelé a kanály dohromady) pošle celý obsahsystem.md. Mezi tím se použije kratšíprompts/system-compact.md(neboLOFEE_SYSTEM_COMPACT_PROMPT_PATH). Příklad:LOFEE_FULL_SYSTEM_EVERY_N=5→ plný prompt u 1., 5., 10., 15. … zprávy celkově od začátku sledování v DB. Po nasazení změny schématu spusťbun run db:push; migrace ze staré tabulkyconversation_prompt_statemůže vyžadovat ručníDROP, pokud ji už máš v Neonu.
- Nainstaluj závislosti:
bun installSchéma je v src/db/schema.ts, konfigurace Drizzle Kit v drizzle.config.ts.
- Push schématu:
bun run db:pushPo přidání sloupce image_urls u tabulky messages je potřeba db:push znovu spustit na aktuální Neon DB.
Tabulka messages používá sloupec discord_message_id (unikátní) — zabraňuje dvojímu uložení při duplicitním messageCreate ve stejném procesu. Po přidání sloupce znovu bun run db:push. Pokud ti pořád chodí dvě odpovědi v kanálu, zkontroluj, že nepouštíš bota ve dvou terminálech se stejným tokenem.
- Studio:
bun run db:studioGlobální deploy slash příkazů (může trvat pár minut, než se projeví):
bun run commands:deployPříkazy:
/memory on/memory off/memory clear/memory status/memory facts— jen pro tebe (ephemeral) embed s uloženými fakty
bun run dev- Bot odpovídá jen v kanálu
LOFEE_CHANNEL_ID(a ve vláknech, která jsou pod tímto kanálem). - Zprávy začínající tečkou
.ignoruje. - Kontext pro LLM bere z posledních 20 zpráv v DB pro daný kanál/vlákno.
- Paměť:
- Po zprávě uživatele vyhodnotí „fakt“ s
score0–1. - Uloží jen pokud
score > 0.9. - Drží max 20 faktů na uživatele.
- Lze vypnout / vymazat přes slash příkazy.
- Po zprávě uživatele vyhodnotí „fakt“ s