diff options
| author | Ben Sima <ben@bensima.com> | 2025-12-11 22:51:44 -0500 |
|---|---|---|
| committer | Ben Sima <ben@bensima.com> | 2025-12-11 22:51:44 -0500 |
| commit | 37a28ead25b5e8e38076905feefa3fa9c8c86604 (patch) | |
| tree | f1964255006622059625f6d0a0d25422a8892195 /Omni/Bot.hs | |
| parent | ff89735dab5d923b13dc6fdca8af7cd448e6234e (diff) | |
Add Telegram bot agent (t-251)
- Omni/Agent/Telegram.hs: Telegram API client with getUpdates/sendMessage
- Omni/Bot.hs: Standalone CLI for running the bot
- User identification via Memory.getOrCreateUserByTelegramId
- Memory-enhanced agent with remember/recall tools
- Run with: bot --token=XXX or TELEGRAM_BOT_TOKEN env var
Diffstat (limited to 'Omni/Bot.hs')
| -rw-r--r-- | Omni/Bot.hs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/Omni/Bot.hs b/Omni/Bot.hs new file mode 100644 index 0000000..77a0408 --- /dev/null +++ b/Omni/Bot.hs @@ -0,0 +1,66 @@ +#!/usr/bin/env run.sh +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE NoImplicitPrelude #-} + +-- | Omni Bot - Family assistant via Telegram. +-- +-- Usage: +-- bot # Uses TELEGRAM_BOT_TOKEN env var +-- bot --token=XXX # Explicit token +-- bot --model=MODEL # Override LLM model +-- +-- : out bot +-- : dep aeson +-- : dep http-conduit +-- : dep stm +module Omni.Bot where + +import Alpha +import qualified Data.Text as Text +import qualified Omni.Agent.Telegram as Telegram +import qualified Omni.Cli as Cli +import qualified Omni.Test as Test +import qualified System.Console.Docopt as Docopt + +main :: IO () +main = Cli.main plan + +plan :: Cli.Plan () +plan = + Cli.Plan + { Cli.help = help, + Cli.move = move, + Cli.test = test, + Cli.tidy = \_ -> pure () + } + +help :: Cli.Docopt +help = + [Cli.docopt| +bot - Omni family assistant via Telegram + +Usage: + bot [--token=TOKEN] [--model=MODEL] + bot test + bot (-h | --help) + +Options: + -h --help Show this help + --token=TOKEN Telegram bot token (or use TELEGRAM_BOT_TOKEN env) + --model=MODEL LLM model to use [default: anthropic/claude-sonnet-4] +|] + +move :: Cli.Arguments -> IO () +move args = do + let maybeToken = fmap Text.pack (Cli.getArg args (Cli.longOption "token")) + Telegram.startBot maybeToken + +test :: Test.Tree +test = + Test.group + "Omni.Bot" + [ Test.unit "help is non-empty" <| do + let usage = str (Docopt.usage help) :: String + null usage Test.@=? False + ] |
