|
Create unique AI personalities with custom prompts, display names, and trigger keywords. Switch between personas on the fly. {
"name": "Philosopher",
"display_name": "Π‘ΠΎΠΊΡΠ°Ρ",
"triggers": "ΡΠΈΠ»ΠΎΡΠΎΡΠΈΡ,ΡΠΌΡΡΠ»,ΠΏΠΎΡΠ΅ΠΌΡ",
"prompt": "Π’Ρ β Π‘ΠΎΠΊΡΠ°Ρ..."
} |
Vector-based conversation memory with time-decay weighting. The bot remembers context and uses relevant information. |
|
Whisper-powered voice transcription. Send voice messages and get intelligent responses through your active persona. |
Analyze images, GIFs (3-frame extraction), and video messages. Multimodal understanding through LLaVA/BakLLaVA. |
|
DuckDuckGo integration for real-time information. No API keys required β privacy-focused search. |
40+ prompt injection patterns detection, strike system, adaptive rate limiting, and automatic blocking. |
git clone https://github.com/bobberdolle1/PersonaForge.git && cd PersonaForge && cp .env.example .envTELOXIDE_TOKEN=your_bot_token_here
OWNER_ID=your_telegram_id
DATABASE_URL=sqlite:persona_forge.db
OLLAMA_CHAT_MODEL=llama3.2|
Cargo cargo run --release |
Docker docker-compose up --build |
graph TB
subgraph Telegram
TG[Telegram API]
end
subgraph PersonaForge
BOT[π€ Bot Handlers]
WEB[π Mini App]
SEC[π‘οΈ Security]
RAG[π§ RAG Engine]
DB[(πΎ SQLite)]
end
subgraph External
OLL[π¦ Ollama]
WHI[π€ Whisper]
DDG[π DuckDuckGo]
end
TG <--> BOT
TG <--> WEB
BOT --> SEC
BOT --> RAG
BOT <--> DB
RAG <--> DB
BOT <--> OLL
BOT <--> WHI
BOT <--> DDG
WEB <--> DB
style BOT fill:#6C63FF,color:#fff
style RAG fill:#00D9FF,color:#000
style SEC fill:#FF6B6B,color:#fff
style DB fill:#4CAF50,color:#fff
π Project Structure
src/
βββ main.rs # Entry point, dispatcher setup
βββ config.rs # Environment configuration
βββ state.rs # Shared state (AppState)
βββ logging.rs # Colored logging system
β
βββ bot/handlers/
β βββ commands.rs # /menu, /status, /create_persona...
β βββ messages.rs # Message processing, RAG retrieval
β βββ callbacks.rs # Inline keyboard handlers
β
βββ db/ # SQLx queries
βββ llm/ # Ollama client
βββ security/ # Prompt injection protection
βββ voice/ # Whisper integration
βββ web/ # DuckDuckGo search
βββ webapp/ # Mini App (Axum + embedded frontend)
| Command | Description |
|---|---|
/menu |
ποΈ Interactive main menu |
/status |
π System status (Ollama, DB, queue) |
/create_persona name|prompt |
π Create new persona |
/list_personas |
π List all personas |
/activate_persona ID |
β Activate persona |
/set_model name |
π§ Change LLM model |
/set_temperature 0.7 |
π‘οΈ Set temperature |
/triggers word1, word2 |
π― Set trigger keywords |
/enable_rag / /disable_rag |
π§ Toggle RAG memory |
/block user_id [min] |
π« Block user |
/whoami |
π€ What bot knows about you |
| π Status Real-time monitoring |
π Personas Create & manage |
π¬ Chats Settings per chat |
π‘οΈ Security Block & monitor |
βοΈ Config Runtime settings |
π§ Setup Mini App
- Start HTTPS tunnel:
ssh -R 80:localhost:8080 serveo.net
# or: ngrok http 8080- Create in @BotFather:
/newapp β Select bot β Name: PersonaForge Panel β URL: https://your-url.com
- Add menu button:
/setmenubutton β Select bot β web_app β ποΈ Panel β URL
π Full .env Example
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# π€ TELEGRAM
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
TELOXIDE_TOKEN=your_bot_token
OWNER_ID=123456789
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# πΎ DATABASE
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DATABASE_URL=sqlite:persona_forge.db
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# π¦ OLLAMA
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OLLAMA_URL=http://localhost:11434
OLLAMA_CHAT_MODEL=llama3.2
OLLAMA_EMBEDDING_MODEL=nomic-embed-text
OLLAMA_VISION_MODEL=llava
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# β‘ GENERATION
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
TEMPERATURE=0.7
MAX_TOKENS=2048
LLM_TIMEOUT_SECONDS=120
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# ποΈ FEATURES
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
VISION_ENABLED=true
VOICE_ENABLED=true
WEB_SEARCH_ENABLED=true
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# π€ WHISPER
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
WHISPER_URL=http://localhost:8080/inference
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# π§ RAG
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
RAG_DECAY_RATE=0.1
SUMMARY_THRESHOLD=50
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# π QUEUE
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
MAX_CONCURRENT_LLM_REQUESTS=3
QUEUE_TIMEOUT_SECONDS=30
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# π WEBAPP
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
WEBAPP_PORT=8080|
π§ Philosopher {
"name": "Π‘ΠΎΠΊΡΠ°Ρ",
"triggers": "ΡΠΈΠ»ΠΎΡΠΎΡΠΈΡ,ΡΠΌΡΡΠ»",
"prompt": "Π’Ρ β Π‘ΠΎΠΊΡΠ°Ρ. ΠΡΠ²Π΅ΡΠ°Π΅ΡΡ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌΠΈ, ΠΏΠΎΠ΄Π²ΠΎΠ΄Ρ ΠΊ ΠΈΡΡΠΈΠ½Π΅."
} |
π€ Tech Expert {
"name": "Π’Π΅Ρ
Π½ΠΈΠΊ",
"triggers": "ΠΊΠΎΠ΄,Π±Π°Π³,ΠΎΡΠΈΠ±ΠΊΠ°",
"prompt": "Π’Ρ β senior ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ. ΠΠ°ΡΡΡ ΡΡΡΠΊΠΈΠ΅ ΠΎΡΠ²Π΅ΡΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΊΠΎΠ΄Π°."
} |
|
π¬ Character {
"name": "Π§ΡΠ²Π°ΠΊ",
"triggers": "dude,Π±ΠΎΡΠ»ΠΈΠ½Π³",
"prompt": "Π’Ρ β The Dude ΠΈΠ· 'ΠΠΎΠ»ΡΡΠΎΠΉ ΠΠ΅Π±ΠΎΠ²ΡΠΊΠΈ'. Π Π°ΡΡΠ»Π°Π±Π»Π΅Π½Π½ΡΠΉ ΡΠΈΠ»ΠΎΡΠΎΡ."
} |
π Friend {
"name": "ΠΡΠΎ",
"triggers": "Π±ΡΠΎ,Π΄ΡΡΠ³",
"prompt": "Π’Ρ β Π»ΡΡΡΠΈΠΉ Π΄ΡΡΠ³. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡ, ΡΡΡΠΈΡΡ, ΠΎΠ±ΡΠ°Π΅ΡΡΡΡ Π½Π΅ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ."
} |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βββββββ βββββββββββββββ ββββββββ βββββββ ββββ βββ ββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββ
β ββββββββββββββ βββββββββββββββββββ βββββββββ ββββββββββββ
β βββββββ ββββββ βββββββββββββββββββ ββββββββββββββββββββββ
β βββ βββββββββββ βββββββββββββββββββββββ βββββββββ ββββ
β βββ βββββββββββ βββββββββββ βββββββ βββ ββββββββ ββββ
β π€ F O R G E v1.0.0 β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββ Configuration ββββββββββββββββββββββββββββββββββββββββββββββ
β π€ Bot Name β PersonaForge β
β π§ LLM Model β llama3.2 β
β β Vision β Enabled β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Database connected: sqlite:persona_forge.db
β Bot identity: MyBot (@my_bot)
β WebApp listening on port 8080
π PersonaForge is ready and listening!
12:34:56 INF [messages] π¬ User in -123456: "ΠΡΠΈΠ²Π΅Ρ!"
12:34:57 INF [llm] π§ Response in 1234ms (156 chars)
- Fork the repository
- Create your branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'feat: add amazing feature' - Push:
git push origin feature/amazing-feature - Open a Pull Request
π Before submitting
cargo fmt # Format code
cargo clippy # Lint
cargo test # Run tests
cargo audit # Security check