2ecf4e903ab02a738b2dbd9ff7d62a35e84df40b
LaodingBot (MVP)
Go-based personal Telegram Agent with:
- Telegram polling transport
- OpenAI-compatible LLM client
- SQLite conversation memory + simple compression
- Tool registry with built-in
file,shell, andgittools - Default-deny security policy via allowlists
- Soul markdown loading for bot personality
- Skills markdown loading for capability context
- ReAct decision loop with automatic tool execution
Now supports mutually exclusive message channels:
telegram(long polling)feishu(official SDK websocket long connection)webui(HTTP + SSE, default:8090)
Quick Start
- Prepare env variables (see
configs/env.sample).- The app auto-loads
configs/env(or.env) if present. - You can also set
CONFIG_ENV_FILE=/path/to/env. - Process environment variables override file values.
- The app auto-loads
- Choose exactly one channel with
MESSAGE_CHANNEL=telegram|feishu|webui.- If
telegram: setTELEGRAM_BOT_TOKEN, keepFEISHU_*empty. - If
feishu: setFEISHU_APP_IDandFEISHU_APP_SECRET, keepTELEGRAM_BOT_TOKENempty. - If
webui: setWEBUI_LISTEN_ADDR(default:8090). - Optional for
webui: setWEBUI_EXPOSE_REASONING=trueto exposethought/tool_call/tool_resultevents to frontend.
- If
- Set log level with
LOG_LEVEL=debug|info|warn|error.- To inspect full skill/tool execution content and detailed ReAct step traces, use
LOG_LEVEL=debug.
- To inspect full skill/tool execution content and detailed ReAct step traces, use
- Configure knowledge and reasoning:
SOUL_PATHfor bot personality markdown.SKILLS_DIRfor skills markdown directory.REACT_MAX_STEPSfor maximum ReAct steps.
- Create runtime directories:
mkdir -p data workspace
- Run:
go mod tidy
go run ./cmd/bot
Telegram Usage
- Normal text enters unified agent pipeline:
- Receive message and load recent memory context
- Match relevant skill(s) from
skills/ - If no skill matched, respond via direct LLM
- If skill matched, run ReAct and call tools (
shell/file/git) only when needed - Return final answer
- No
/tool ...command is required for normal use.
Feishu Usage
- Bot uses Feishu official SDK long connection (
ws) to subscribeim.message.receive_v1text events. - Received text is forwarded to the same agent pipeline and replied back to the same chat.
Knowledge Files
- Soul file default path:
bot_context/soul.md - Skills directory default path:
skills/ - Skill format uses subdirectories:
skills/<skill_name>/skill.md
Docker Build And Run
Required Files And Folders
Before building/running with Docker, ensure these exist:
Dockerfiledocker-compose.yamlworkspace/agent_runtime/configs/envworkspace/agent_runtime/bot_context/soul.mdworkspace/agent_runtime/skills/workspace/agent_runtime/data/workspace/agent_runtime/workspace/
Quick bootstrap command:
mkdir -p workspace/agent_runtime/{configs,bot_context,skills,data,workspace}
cp -n configs/env.sample workspace/agent_runtime/configs/env
cp -n bot_context/soul.md workspace/agent_runtime/bot_context/soul.md
cp -rn skills/* workspace/agent_runtime/skills/
Minimum env config in workspace/agent_runtime/configs/env:
MESSAGE_CHANNEL=webui
WEBUI_LISTEN_ADDR=:8090
WEBUI_EXPOSE_REASONING=false
LLM_API_KEY=your_api_key
docker-compose.yaml already mounts ./workspace/agent_runtime into the container, so host-side data is persistent.
Build Docker Image
docker build -t laodingbot:latest .
Run With Docker (Single Container)
docker run --rm -d \
--name laodingbot \
-p 8090:8090 \
--env-file ./workspace/agent_runtime/configs/env \
-e MESSAGE_CHANNEL=webui \
-e WEBUI_LISTEN_ADDR=:8090 \
-e WEBUI_EXPOSE_REASONING=false \
-e AGENT_WORKSPACE_DIR=/app/workspace/agent_runtime \
-v "$(pwd)/workspace/agent_runtime:/app/workspace/agent_runtime" \
laodingbot:latest
Run With Docker Compose
Build and start:
docker compose up -d --build
View logs:
docker compose logs -f laodingbot
Stop and remove:
docker compose down
After startup, open WebUI at http://localhost:8090.
Security Notes
shellonly allows commands listed inALLOWED_COMMANDS.fileonly allows paths insideALLOWED_DIRS.gitonly allows common git subcommands and runs insideWORK_DIR.- Working directory for shell is limited by
WORK_DIR.
Next Iteration
- Add skill runtime (process-level hot-plug via RPC)
- Add bootstrap pipeline (generate -> vet/test -> sandbox run -> register)
- Add approval gate for risky commands
Description
Languages
Go
99.4%
Shell
0.3%
Dockerfile
0.3%