7c00b4ed9a3c37ed5cace135ccdef62ac46b4844
Build & Deploy ResearchOwl / build-and-push (push) Successful in 8s
La plantilla daba los encabezados LITERALES («## Contexto», «## Hechos Clave»), así que el modelo los escupía tal cual o los usaba de prefijo. Se ve en los dos blogs: 219 encabezados sucios en el ES (limpiados hoy a mano) y 77 de los 340 del EN empezando por la etiqueta de la plantilla — 37 artículos ingleses terminan con un H2 que dice «Conclusion». Ahora la estructura va entre corchetes, con la advertencia de que es guía interna, y una regla prohíbe la etiqueta como encabezado y como prefijo. Además, solo en el ES: mayúscula de oración. El prompt no decía nada de capitalización y la única muestra que veía el modelo era «Hechos Clave», en Title Case; generalizaba ese estilo a todos los encabezados, que en español es incorrecto. Va con contraejemplo y con el caso de los dos puntos y la raya. En el EN no se toca: ahí el Title Case es lo correcto. Sin verificación posible hasta el próximo artículo — un prompt no se prueba en seco. El check de mayúsculas de seo_watch (chemavx-seo-tools b0d5e1b) cubre la regresión en el ES a partir de ahora.
🦉 ResearchOwl
Exhaustive research engine with Telegram interface.
Recursively discovers, scrapes, and processes sources from across the web, then generates podcast scripts, blog posts, reports, or social threads using Ollama.
Architecture
Telegram (/research <topic>)
↓
ExhaustiveScraper
├── DuckDuckGo (8 queries × 5 results)
├── Wikipedia + recursive internal links
├── Reddit (top posts + top comments)
├── YouTube (transcripts)
├── PDFs (public documents)
└── Web scraping (trafilatura)
↓ recursive expansion (depth 1-3)
ContentProcessor (Ollama qwen2.5:3b)
├── Chunking (800 token chunks, 100 overlap)
├── Quality scoring (0-10 per chunk)
├── Embeddings (cosine similarity RAG)
└── Deduplication
↓
OutputGenerator (Ollama)
├── 🎙️ Podcast script (20-30 min)
├── 📝 Blog post (1500-2500 words)
├── 📊 Research report (structured)
└── 🐦 Social thread (15-25 tweets)
Telegram Commands
| Command | Description |
|---|---|
/research <topic> |
Start exhaustive research |
/status |
Check progress |
/finish |
Stop early, proceed to generation |
/generate podcast|blog|report|thread |
Generate output |
/sources |
List all sources found |
/cancel |
Cancel current research |
Local Development
# 1. Clone and setup
git clone https://git.chemavx.xyz/chemavx/researchowl
cd researchowl
# 2. Create virtualenv
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# 3. Configure
cp .env.example .env
# Edit .env with your values
# 4. Run
python main.py
Deploy to k3s
# 1. Create namespace and secrets
kubectl create namespace researchowl
kubectl create secret generic researchowl-secrets \
--from-literal=telegram-bot-token=YOUR_TOKEN \
--from-literal=telegram-allowed-users=YOUR_USER_ID \
-n researchowl
# 2. Copy manifests to your k8s-manifests repo
cp k8s/*.yaml /path/to/k8s-manifests/researchowl/
# 3. Apply ArgoCD app
kubectl apply -f k8s/argocd-app.yaml
# 4. Push to Gitea → Gitea Actions builds → ArgoCD deploys
git add . && git commit -m "feat: add researchowl" && git push
Tuning
| Variable | Default | Description |
|---|---|---|
MAX_SOURCES |
150 | Hard cap on sources |
MAX_DEPTH |
3 | Link recursion depth |
QUALITY_THRESHOLD |
0.4 | Min chunk quality (0-1) |
REQUEST_DELAY |
1.0s | Delay between requests |
Want more thoroughness?
- Increase
MAX_SOURCESto 300+ - Increase
MAX_DEPTHto 4-5 - Lower
QUALITY_THRESHOLDto 0.3
Want faster results?
- Lower
MAX_SOURCESto 50 - Set
MAX_DEPTHto 1-2 - Higher
QUALITY_THRESHOLDto 0.6
Notes
- Uses qwen2.5:3b (your existing Ollama) for all AI tasks — zero API cost
- Optionally add
ANTHROPIC_API_KEYfor Claude fallback on generation - SQLite database stored in
/data/researchowl.db - All outputs saved to DB and available via
/outputs
Languages
Python
99.2%
Makefile
0.7%