{"id":51542790,"url":"https://github.com/jonathanhecl/ollamabot","last_synced_at":"2026-07-09T15:30:25.124Z","repository":{"id":368554332,"uuid":"1241133411","full_name":"jonathanhecl/ollamabot","owner":"jonathanhecl","description":"Local-first autonomous agent powered explicitly by local models via Ollama. It implements dynamic capability routing to dispatch specialized tasks (such as text chat, vision, audio transcription, embeddings/memory, and summarization) to different role-specific local models.","archived":false,"fork":false,"pushed_at":"2026-07-01T04:41:35.000Z","size":2057,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-01T06:30:33.482Z","etag":null,"topics":["agents","capacity","harness","image","local","loop","models","ollama","rag","routing","skills","telegram","thinking","tools","vision","web"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonathanhecl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"agents.md","dco":null,"cla":null}},"created_at":"2026-05-17T02:03:56.000Z","updated_at":"2026-07-01T04:40:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jonathanhecl/ollamabot","commit_stats":null,"previous_names":["jonathanhecl/ollamabot"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/jonathanhecl/ollamabot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanhecl%2Follamabot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanhecl%2Follamabot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanhecl%2Follamabot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanhecl%2Follamabot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonathanhecl","download_url":"https://codeload.github.com/jonathanhecl/ollamabot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanhecl%2Follamabot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35304874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","capacity","harness","image","local","loop","models","ollama","rag","routing","skills","telegram","thinking","tools","vision","web"],"created_at":"2026-07-09T15:30:21.400Z","updated_at":"2026-07-09T15:30:25.117Z","avatar_url":"https://github.com/jonathanhecl.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ollamabot\n\nLocal-first autonomous agent powered explicitly by local models via [Ollama](https://ollama.com). It implements dynamic capability routing to dispatch specialized tasks (such as text chat, vision, audio transcription, embeddings/memory, and summarization) to different role-specific local models. A single Go process runs the agent core, and **Web** and **Telegram** act purely as transport channels talking to this unified engine.\n\n![ollamabot screenshot](image.png)\n\n### Dynamic Routing in Action (Example Workflow)\n\nIn a single Telegram chat session, you can orchestrate multiple local models for a single prompt turn:\n1. **Voice Input**: You send a voice message. The engine routes the audio to an Ollama model with audio capability (like `gemma4:e2b`) to obtain the text transcript.\n2. **Visual Context**: You also attach a photo of a whiteboard. The engine routes the image to a vision model (like `qwen3.5:2b`) to extract the visual details.\n3. **Reasoning**: The main coordinator model (like `qwen3.5:9b-uncensored`) starts a thinking phase, reasoning step-by-step about the combined text and visual inputs.\n4. **Tool Execution**: The main model decides to invoke the `generate_image` tool, sending a request to a local image-generation model (like `flux2-klein:4b` run via Ollama) to generate a new image.\n5. **Unified Output**: The bot delivers the final response text along with the generated image directly in your Telegram chat.\n6. **Cross-Channel Sync**: Since conversation history is session-centric, you can open the Web UI at any time to monitor the exact reasoning steps, metrics, and generated files of that same Telegram chat in real time.\n\n## Features\n\n- **Dual channels**: Web UI (SSE streaming, settings, session browser) and Telegram bot (polling, inline keyboards, media download)\n- **28 agent tools**: web search, file read/write/edit, regex search, code navigation, unified diff, shell commands, memory, skills, plans, image generation, and more\n- **Multimodal**: image and audio attachments with dedicated model routing and structured transcription\n- **Long-term memory**: RAG with local embeddings — the agent stores, searches, and consolidates knowledge autonomously\n- **Sleep mode**: background learning cycles that reflect on past conversations when the user is inactive\n- **Goals**: persistent objectives with autonomous execution loops and progress evaluation\n- **Autonomous projects**: background workspace tasks with web dashboard and Telegram notifications\n- **Skills**: custom reusable instruction sets the agent can create, edit, and invoke\n- **Plan system**: structured multi-step plans with user approval, progress tracking, and deferred continuation\n- **Thinking support**: reasoning blocks displayed in real-time when the model supports it\n- **Session management**: persisted history, auto-naming, context window indicator, cross-channel sync\n- **Security**: per-tool approval system, risk classification, workspace sandboxing, optional web password\n- **Zero external dependencies**: pure Go, only requires a local Ollama instance (and `ffmpeg` for converting voice messages when using Telegram, which is downloaded automatically if missing)\n\n## Architecture\n\n```text\n                    ┌─────────────────────────────────────┐\n                    │         cmd/ollamabot (main)        │\n                    │  config (.env) · sleep · goals · autonomous │\n                    └─────────────────┬───────────────────┘\n                                      │\n          ┌───────────────────────────┼───────────────────────────┐\n          │                           │                           │\n          ▼                           ▼                           ▼\n   internal/web              internal/engine              internal/telegram\n   HTTP · SSE · UI            ProcessTurn (chat core)      polling · keyboards\n          │                           │                           │\n          └───────────────────────────┼───────────────────────────┘\n                                      │\n                    ┌─────────────────┴─────────────────┐\n                    │ agent · router · tools · sessions │\n                    │ memory · probe · config           │\n                    └─────────────────┬─────────────────┘\n                                      ▼\n                              Ollama (local)\n```\n\n| Layer | Packages | Responsibility |\n|-------|----------|----------------|\n| **App engine** | `internal/engine` | Single chat turn: media routing, context injection, tools, recorder, auto-naming |\n| **Agent loop** | `internal/agent` | Streaming completion, tool rounds, context optimization, SOUL/profile |\n| **Model router** | `internal/router` | Vision/audio pre-processing before the main model |\n| **Config** | `internal/config` | `.env` is the runtime source of truth; `ResolveModel(role)` picks models |\n| **Web channel** | `internal/web` | Local UI, settings editor, session browser, SSE streaming |\n| **Telegram channel** | `internal/telegram` | Bot API, media download, inline approvals, chunked replies |\n\n**Web vs Telegram:** same `engine.ProcessTurn` pipeline. The web UI adds configuration panels,\nmemory explorer, project dashboard, and richer step/metrics display. Telegram keeps channel-specific\npolicies (session expiry, relationship checks, ffmpeg for voice). Neither channel chooses the main\nmodel at request time—that comes from `OLLAMA_DEFAULT_MODEL` in `.env`.\n\nSee [`docs/media-routing.md`](docs/media-routing.md) for the full multimodal routing flow.\n\n## Channels (pick at least one)\n\nThe agent service needs **at least one channel** to run. You can use web, Telegram, or both — but not neither.\n\n| Mode | `.env` | What starts |\n|------|--------|-------------|\n| Web only | `SERVER_ENABLED=true`, no `TELEGRAM_BOT_TOKEN` | Local UI on `SERVER_PORT` |\n| Telegram only | `SERVER_ENABLED=false`, `TELEGRAM_BOT_TOKEN=...` | Bot in foreground |\n| Both | `SERVER_ENABLED=true` + `TELEGRAM_BOT_TOKEN=...` | Web server + Telegram in background |\n\nIf both are disabled, default startup fails with an error asking you to enable one.\n\n**Without a channel:** only maintenance subcommands work — mainly `probe` for checking Ollama models\nand capabilities without starting the agent. Example: `go run ./cmd/ollamabot probe models`.\n\n## Quick start\n\n### Prerequisites\n\n- [Go](https://go.dev/dl/) 1.25+\n- [Ollama](https://ollama.com) running locally with at least one model installed\n- `ffmpeg` (required only for voice message transcription on Telegram; the bot downloads it automatically if it is not present on your system)\n\n### Setup\n\nCopy [`.env.example`](.env.example) to `.env` and set at least:\n\n```env\nOLLAMA_BASE_URL=http://localhost:11434\nOLLAMA_DEFAULT_MODEL=your-model:tag\nSERVER_ENABLED=true\nSERVER_PORT=8080\n```\n\nRun with no subcommand (starts web and/or Telegram per `.env`):\n\n```bash\ngo run ./cmd/ollamabot\n```\n\nIf `.env` is missing next to the executable, the binary runs an interactive setup (Ollama URL, web server, port, network exposure, password, Telegram token).\n\n**Telegram-only** (no web server):\n\n```env\nSERVER_ENABLED=false\nTELEGRAM_BOT_TOKEN=your_token\n```\n\n\n**Both channels** (default when both are enabled): web on `SERVER_PORT`, Telegram bot in background.\n\n### Environment Variables Reference\n\nBelow is a detailed guide to all configuration parameters available in your `.env` file:\n\n#### Server Configuration\n- `SERVER_ENABLED` (default `true`): Boolean. Enables or disables the local Web UI server.\n- `SERVER_PORT` (default `8080`): The port on which the Web UI server will run.\n- `SERVER_PASSWORD`: Optional string. If set, requires this password to access the Web UI.\n- `SERVER_EXPOSE_NETWORK` (default `false`): Boolean. If `true`, binds the web server to `0.0.0.0` making it accessible over the local network. Otherwise, binds to `127.0.0.1`.\n\n#### Sessions\n- `SESSION_AUTO_NAME` (default `true`): Boolean. If enabled, automatically titles new chat sessions based on the context of the first few turns.\n- `SESSION_EXPIRY_MIN` (default `30`): Integer. Inactivity time in minutes before a Telegram session context is expired.\n- `PLAN_CONFIRMATION` (default `smart`): Behavior for tool/plan approval. Options:\n  - `smart`: Automatically prompts for approval on risky tools (e.g., shell command execution, file modifications).\n  - `always`: Prompts for confirmation before executing any tool or step.\n  - `never`: Runs all tools and plans autonomously without asking.\n\n#### Ollama Connection \u0026 Coordinator\n- `OLLAMA_BASE_URL` (default `http://localhost:11434`): The API URL of your local Ollama instance.\n- `OLLAMA_DEFAULT_MODEL` (**Required**): The main model used for orchestrating the agent, chat conversation, tools reasoning, and final replies.\n- `OLLAMA_PROBE_MODELS`: Comma-separated list of models to pre-probe for capabilities at startup.\n\n#### Role-Specific Models\n*These will fall back to the main coordinator model (`OLLAMA_DEFAULT_MODEL`) if they are not set and the main model has corresponding capability, or the feature will be disabled.*\n- `OLLAMA_MODEL_VISION`: Dedicated model used for analyzing image attachments.\n- `OLLAMA_MODEL_AUDIO`: Dedicated model used for transcribing audio voice message attachments.\n- `OLLAMA_MODEL_EMBED`: Dedicated model used for generating vector embeddings for semantic RAG memory.\n- `OLLAMA_MODEL_IMAGE`: Dedicated model used for the `generate_image` tool (e.g. Flux).\n- `OLLAMA_MODEL_LEARNING`: Dedicated model used for reflection and consolidation in Sleep Mode.\n- `OLLAMA_MODEL_SUBAGENT`: Dedicated model used for subagent tasks (such as planning, auto-naming, and summarizing).\n\n#### Model Inference Controls\n- `OLLAMA_IMAGE_STEPS` (default `4`): Inference step count when generating images.\n- `OLLAMA_THINK_ENABLED` (default `true`): Enables or disables reasoning/thinking extraction (like `\u003cthink\u003e` tags in models like DeepSeek R1).\n- `OLLAMA_MAX_TOKENS` (default `16384`): Max output token limit for completions.\n- `OLLAMA_MAX_CONTEXT` (default `0`): Max context window limit for Ollama prompts. Set to `0` to let Ollama use the model's defaults.\n\n#### Resource Limits\n- `SUBAGENT_TIMEOUT_MINUTES` (default `10`): Max runtime in minutes for a background subagent execution before it is terminated.\n\n#### Telegram Settings\n- `TELEGRAM_BOT_TOKEN`: The bot API token obtained from Telegram's `@BotFather`.\n- `TELEGRAM_AUTHORIZED_IDS`: Comma-separated list of Telegram user ID integers allowed to interact with this bot. Leave empty for public access.\n- `TELEGRAM_STARTUP_NOTIFICATION` (default `false`): Send a startup message to authorized users when the bot starts up.\n\n#### Paths\n- `WORKSPACE_PATH` (default `workspace`): Directory where tools read/write/edit files and run commands.\n- `SESSIONS_PATH` (default `sessions`): Location for storing session histories and attachments.\n- `MEMORY_PATH` (default `memory`): Location for local RAG database/embeddings.\n- `SKILLS_PATH` (default `skills`): Location for storing custom reusable skills markdown files.\n\n#### Sleep Mode\n- `SLEEP_MODE_ENABLED` (default `false`): Enables the background learning/consolidation loop.\n- `SLEEP_MODE_INACTIVITY_THRESHOLD` (default `30m`): Inactivity duration (e.g., `30m`, `1h`) before starting background reflection.\n- `SLEEP_MODE_RESUME_DELAY` (default `10m`): Wait duration before resuming sleep cycles after new activity.\n- `SLEEP_MODE_SUBAGENTS_ENABLED` (default `false`): Whether subagents are allowed to run background tasks during sleep.\n\n#### Web Search\n- `WEB_SEARCH_ENABLED` (default `false`): Enable/disable the `web_search` tool.\n- `WEB_SEARCH_PRIORITY` (default `ddg`): Comma-separated order of search providers to try (e.g., `brave,tavily,ddg`).\n- `WEB_SEARCH_BRAVE_API_KEY`: API key for Brave Search.\n- `WEB_SEARCH_TAVILY_API_KEY`: API key for Tavily Search.\n\n## Model roles\n\nConfigured in `.env` and editable from the web **Manage Models \u0026 Roles** UI (writes back to `.env`):\n\n| Role | Env variable | Used for |\n|------|----------------|----------|\n| Main | `OLLAMA_DEFAULT_MODEL` | Chat, tools, final answers (required) |\n| Vision | `OLLAMA_MODEL_VISION` | Image pre-processing when set |\n| Audio | `OLLAMA_MODEL_AUDIO` | Audio transcription when set |\n| Subagent | `OLLAMA_MODEL_SUBAGENT` | Session titles, context optimization; falls back to main |\n| Learning | `OLLAMA_MODEL_LEARNING` | Sleep-mode reflection; falls back to main |\n| Embeddings | `OLLAMA_MODEL_EMBED` | Long-term memory search |\n| Image gen | `OLLAMA_MODEL_IMAGE` | `generate_image` tool |\n| Thinking | `OLLAMA_THINK_ENABLED` | Reasoning phase when main model supports it |\n\nCapabilities are probed via `internal/probe`; missing roles disable features gracefully without user-facing errors.\n\n## Agent tools\n\nThe agent has access to the following tools. Risky operations (file writes, shell commands) require user approval via Web modal or Telegram inline keyboard.\n\n| Tool | Description |\n|------|-------------|\n| `web_search` | Search the web via DuckDuckGo, Brave, or Tavily |\n| `fetch_webpage` | Fetch and read raw text content from a URL |\n| `read_file` | Read file contents (with offset/limit pagination) or list directory entries in the workspace |\n| `write_file` | Write file contents atomically to the workspace (supports append mode) |\n| `edit_file` | Replace exact text in an existing file with fuzzy-match fallback |\n| `apply_diff` | Apply a unified diff to an existing file — efficient for multi-hunk changes |\n| `search_files` | Regex search across files in the workspace with glob filtering |\n| `list_files` | List files and directories with recursive and glob filter options |\n| `list_code_definitions` | Extract function/method/type names from Go source files |\n| `todo_write` | Maintain a live TODO checklist during multi-step tasks |\n| `execute_command` | Run shell commands (ffmpeg, python3, etc.) in the workspace with configurable timeout |\n| `memory_search` | Semantic search over long-term memory via embeddings |\n| `memory_add` | Store text in long-term memory for future retrieval |\n| `memory_delete` | Delete an outdated memory entry by ID |\n| `memory_list` | List recent memory entries |\n| `skill_list` | List all installed custom skills |\n| `skill_get` | Retrieve raw instructions of a specific skill |\n| `skill_create` | Create a new custom skill with frontmatter and checklist |\n| `skill_edit` | Modify or merge properties of an existing skill |\n| `skill_delete` | Remove a custom skill |\n| `present_plan` | Present a structured plan for user approval before complex tasks |\n| `complete_plan_step` | Mark a plan step as completed |\n| `defer_plan_continuation` | Pause an active plan for later resumption |\n| `ask_clarification` | Ask the user a clarifying question with clickable options |\n| `generate_image` | Generate an image via the configured image model |\n| `list_session_attachments` | List all attachments in the current session |\n| `view_session_attachment` | View contents of a specific session attachment |\n| `send_files` | Send files or directories from the workspace to the user |\n\n## Telegram commands\n\n| Command | Description |\n|---------|-------------|\n| `/start` | Start a new session |\n| `/new` | Start a new session (clears previous history) |\n| `/status` | Show Ollama version, loaded models, and VRAM usage |\n| `/settings` | View and change model roles via inline keyboard |\n| `/sessions` | List the 10 most recent sessions with titles and IDs |\n| `/session \u003cid\u003e` | Switch to a specific session |\n| `/goal \u003cobjective\u003e` | Set a persistent goal for autonomous execution |\n| `/goal` | Check current goal status |\n| `/goal pause` / `resume` / `clear` | Control goal execution |\n| `/projects` | List active autonomous projects |\n| `/memory \u003cquery\u003e` | Search semantic memory |\n| `/feedback \u003ctext\u003e` | Submit feedback for the agent to learn from |\n| `/reloadmodels` | Reload model inventory and save snapshot |\n\n## Advanced features\n\n- **Sleep mode** (`SLEEP_MODE_ENABLED`): when the user is inactive, the agent runs background learning cycles using the learning model to reflect on past conversations and consolidate memory. Includes GPU load checking via `/api/ps` to avoid slowing down the machine.\n\n- **Goals** (`/goal`): set a persistent objective and the agent executes autonomous iterations (up to 20 cycles) with progress evaluation via subagents. Works in both Web and Telegram.\n\n- **Autonomous projects**: background workspace tasks with a web dashboard. Telegram receives proactive notifications on task completion or failure.\n\n- **Skills**: custom reusable instruction sets stored as markdown files with frontmatter. The agent can create, edit, and invoke skills. Duplicate prevention via name similarity (Levenshtein) and description similarity (Jaccard).\n\n- **RAG memory**: long-term semantic memory using local embeddings. The agent autonomously manages what to store, search, and delete. Pre-fetched on each turn with a 0.70 similarity threshold. Consolidation prevents duplicates above 0.85 cosine similarity.\n\n- **Plan system**: structured multi-step plans with user approval, per-step completion tracking, deferred continuation, and background resumption via `PlanMonitor`.\n\n- **User feedback loop**: text feedback (corrections, preferences, praise) saved via Web UI or Telegram `/feedback`, processed during sleep mode learning cycles.\n\nSee [`docs/`](docs/) for detailed documentation on each feature.\n\n## CLI commands\n\n```bash\ngo run ./cmd/ollamabot probe models\ngo run ./cmd/ollamabot probe snapshot --out docs/probe-cache.json\ngo run ./cmd/ollamabot probe chat --model \u003cname\u003e\ngo run ./cmd/ollamabot probe tools --model \u003cname\u003e\ngo run ./cmd/ollamabot probe json --model \u003cname\u003e\ngo run ./cmd/ollamabot probe thinking --model \u003cname\u003e\ngo run ./cmd/ollamabot probe embeddings --model \u003cname\u003e\ngo run ./cmd/ollamabot probe vision --model \u003cname\u003e --image /path/to/image.jpg\ngo run ./cmd/ollamabot probe audio --model \u003cname\u003e --audio /path/to/audio.wav\ngo run ./cmd/ollamabot docs generate --out docs\ngo run ./cmd/ollamabot serve --port 8080 --cache docs/probe-cache.json\ngo run ./cmd/ollamabot version\n```\n\nGenerated references: [`docs/ollama-reference.md`](docs/ollama-reference.md) and [`docs/ollama-usage.md`](docs/ollama-usage.md). See [`docs/README.md`](docs/README.md) for more details.\n\n## Web UI\n\n- Streamed chat with thinking blocks, tool steps, and metrics\n- Multimodal attachments (image, audio, files) with drag \u0026 drop\n- Session sidebar with persisted history under `SESSIONS_PATH`\n- Settings for Ollama URL, model roles, sleep mode, web search, Telegram, paths\n- Memory explorer: search, add, delete, and re-index RAG entries\n- Skills explorer: list, view, edit, and delete custom skills\n- Project dashboard for autonomous tasks\n- Real-time sync via SSE between Web and Telegram activity\n- Optional password (`SERVER_PASSWORD`) and LAN exposure (`SERVER_EXPOSE_NETWORK`)\n\nRuntime model selection is **not** stored in the browser; the UI reflects server config only.\n\n**Chrome / Edge / Brave on LAN:** for microphone or clipboard on a non-HTTPS origin, enable\n`chrome://flags/#unsafely-treat-insecure-origin-as-secure` and add your manager URL\n(e.g. `http://192.168.1.50:8080`), then relaunch.\n\n## Build\n\n```bash\n# Windows\nbash build-win.sh\n\n# macOS (Apple Silicon)\nbash build-mac.sh\n\n# Manual\ngo build -ldflags \"-X 'main.buildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)'\" ./cmd/ollamabot\n```\n\n### Multi-platform \u0026 Releases (PowerShell)\n\nYou can compile binaries for all major platforms (Windows, Linux, macOS) and create GitHub Releases with the packaged assets using the provided PowerShell scripts:\n\n```powershell\n# Compile and package for all platforms (outputs to dist/)\n.\\build-all.ps1 -Version v0.1.0\n\n# Run build-all, create git tag, push to origin, and create GitHub release\n.\\release.ps1 v0.1.0\n```\n\n## Project structure\n\n| Path | Purpose |\n|------|---------|\n| `cmd/ollamabot/` | Process entry, shared managers, channel startup |\n| `internal/engine/` | `ProcessTurn`, context injection, session naming |\n| `internal/agent/` | Agent loop, goals, autonomous projects, plan monitor, XML fallback |\n| `internal/router/` | Media routing (vision/audio pre-processing) |\n| `internal/tools/` | Tool registry and handlers (20+ tools) |\n| `internal/sessions/` | Session persistence, approvals, attachments |\n| `internal/memory/` | RAG memory store with embeddings |\n| `internal/learning/` | Sleep manager, feedback loop |\n| `internal/skills/` | Skill catalog and management |\n| `internal/web/` | Web server, SSE, static UI |\n| `internal/telegram/` | Telegram bot, media download, inline keyboards |\n| `internal/config/` | `.env` loading, model role resolution |\n| `internal/probe/` | Model capability probing |\n| `internal/ollama/` | HTTP client for Ollama REST API |\n| `.env` / `.env.example` | Runtime configuration |\n\n## Agent guidelines\n\nSee [`AGENTS.md`](AGENTS.md) for module layout, lifecycle, and contribution rules for coding agents.\n\n## License\n\n[MIT](LICENSE) © 2026 Jonathan Hecl\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanhecl%2Follamabot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonathanhecl%2Follamabot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanhecl%2Follamabot/lists"}