bot.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/usr/bin/env python3
  2. """OpenClaw — Telegram bot that proxies messages to Ollama."""
  3. import sys
  4. import logging
  5. import yaml
  6. import requests
  7. from telegram import Update
  8. from telegram.ext import ApplicationBuilder, MessageHandler, CommandHandler, filters, ContextTypes
  9. CONFIG = {}
  10. def load_config(path: str) -> dict:
  11. with open(path) as f:
  12. return yaml.safe_load(f)
  13. async def cmd_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
  14. model = CONFIG["ollama"]["model"]
  15. await update.message.reply_text(
  16. f"Hello! I'm connected to Ollama using {model}. Send me any message."
  17. )
  18. async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
  19. text = update.message.text
  20. if CONFIG["bot"].get("typing_indicator", True):
  21. await context.bot.send_chat_action(
  22. chat_id=update.effective_chat.id, action="typing"
  23. )
  24. try:
  25. resp = requests.post(
  26. f"{CONFIG['ollama']['base_url']}/api/generate",
  27. json={
  28. "model": CONFIG["ollama"]["model"],
  29. "prompt": text,
  30. "stream": False,
  31. },
  32. headers={"Authorization": f"Bearer {CONFIG['ollama']['api_key']}"},
  33. timeout=CONFIG["ollama"]["timeout"],
  34. )
  35. resp.raise_for_status()
  36. result = resp.json()["response"]
  37. max_len = CONFIG["bot"].get("max_message_length", 4096)
  38. if len(result) > max_len:
  39. result = result[:max_len]
  40. except Exception as e:
  41. logging.error("Ollama error: %s", e)
  42. result = CONFIG["bot"].get("error_message", "Sorry, I encountered an error.")
  43. await update.message.reply_text(result)
  44. def main() -> None:
  45. global CONFIG
  46. config_path = "config.yml"
  47. if "--config" in sys.argv:
  48. config_path = sys.argv[sys.argv.index("--config") + 1]
  49. CONFIG = load_config(config_path)
  50. log_level = CONFIG.get("logging", {}).get("level", "INFO")
  51. logging.basicConfig(
  52. level=getattr(logging, log_level),
  53. format="%(asctime)s %(levelname)s %(message)s",
  54. )
  55. app = ApplicationBuilder().token(CONFIG["telegram"]["token"]).build()
  56. app.add_handler(CommandHandler("start", cmd_start))
  57. app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
  58. logging.info("OpenClaw starting with model: %s", CONFIG["ollama"]["model"])
  59. app.run_polling()
  60. if __name__ == "__main__":
  61. main()