dotfiles/.local/bin/ollama_remote.py
2025-05-28 18:33:04 +02:00

149 lines
6.0 KiB
Python
Executable File

import weechat
import requests
import json
from requests.auth import HTTPBasicAuth
"""
Ollama Bot for WeeChat (Remote Version with Authentication)
This script automatically responds to mentions in channels and private messages using an Ollama LLM hosted remotely.
Features:
- Responds to mentions in channels.
- Can respond to private messages if enabled.
- Allows manual queries using the /ollama command.
- Configurable via WeeChat /set commands.
Usage:
- To ask a question manually:
/ollama What is Python?
- To enable or disable automatic responses in channels:
/set plugins.var.python.ollama.highlight_response on # Enable responses in channels
/set plugins.var.python.ollama.highlight_response off # Disable responses in channels
- To enable or disable automatic responses in private messages:
/set plugins.var.python.ollama.pm_response on # Enable PM responses
/set plugins.var.python.ollama.pm_response off # Disable PM responses
Dependencies:
- Requires an Ollama server running at https://ollama.priet.us/api/generate with authentication.
"""
# Script metadata
SCRIPT_NAME = "ollama"
SCRIPT_AUTHOR = "teraflops"
SCRIPT_VERSION = "2.1"
SCRIPT_LICENSE = "MIT"
SCRIPT_DESC = "Automatically responds to mentions using Ollama and allows manual queries, including PMs"
OLLAMA_API_URL = "https://ollama.priet.us/api/generate"
OLLAMA_USER = "nginx-user"
OLLAMA_PASS = "wasamasa123" # Replace with the actual password
# Register the script
weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "", "")
# Script configuration in Weechat
def setup_config():
if not weechat.config_is_set_plugin("highlight_response"):
weechat.config_set_plugin("highlight_response", "on") # Enable auto-responses by default
if not weechat.config_is_set_plugin("pm_response"):
weechat.config_set_plugin("pm_response", "off") # Disable PM responses by default
setup_config()
def ask_ollama(message):
"""Send a query to Ollama and return the complete response."""
try:
data = {"model": "gemma:2b", "prompt": message, "stream": False}
headers = {"Content-Type": "application/json", "User-Agent": "WeeChat-OllamaBot/1.0"}
weechat.prnt("", f"[DEBUG] Sending request to Ollama: {OLLAMA_API_URL} with prompt: {message}")
response = requests.post(
OLLAMA_API_URL,
json=data,
headers=headers,
auth=HTTPBasicAuth(OLLAMA_USER, OLLAMA_PASS),
verify=False, # Change to True if you have a valid certificate
timeout=60 # Wait up to 60 seconds before timing out
)
if response.status_code == 401:
return "Authentication Error: Check username/password."
elif response.status_code == 403:
return "Permission Denied: Verify API access."
elif response.status_code == 504:
return "Error: The server took too long to respond (504 Gateway Timeout)."
elif response.status_code != 200:
return f"HTTP Error {response.status_code}: {response.text}"
response_json = response.json()
return response_json.get("response", "No response received from Ollama.")
except requests.exceptions.Timeout:
return "Error: Request to Ollama timed out."
except requests.exceptions.RequestException as e:
return f"Error connecting to Ollama: {str(e)}"
def command_ollama(data, buffer, args):
"""Command /ollama to manually ask Ollama a question."""
weechat.prnt("", f"[DEBUG] /ollama command received with args: {args}")
if not args:
weechat.prnt(buffer, "Usage: /ollama <question>")
return weechat.WEECHAT_RC_OK
response = ask_ollama(args)
weechat.prnt(buffer, response)
return weechat.WEECHAT_RC_OK
def message_callback(data, buffer, date, tags, displayed, highlight, prefix, message):
"""Detect mentions in channels or private messages and respond automatically with Ollama."""
if weechat.config_get_plugin("highlight_response") == "off":
return weechat.WEECHAT_RC_OK
buffer_type = weechat.buffer_get_string(buffer, "localvar_type")
is_private = buffer_type == "private"
username = weechat.info_get("irc_nick", "") # Get the current IRC username
is_mentioned = f"@{username.lower()}" in message.lower() # Ensure @username is explicitly mentioned
# Ignore private messages if pm_response is off
if is_private and weechat.config_get_plugin("pm_response") == "off":
return weechat.WEECHAT_RC_OK
# Only respond in private messages if it's a direct question
if is_private and not message.strip().endswith("?"):
return weechat.WEECHAT_RC_OK
# Only respond in channels if explicitly mentioned or highlighted
if not is_private and not is_mentioned and not int(highlight):
return weechat.WEECHAT_RC_OK
response = ask_ollama(message)
if is_private:
weechat.command(buffer, f"/msg {prefix} {response}") # Reply to private message
else:
weechat.command(buffer, f"/say {response}") # Reply in the channel
return weechat.WEECHAT_RC_OK
def config_callback(data, option, value):
"""Callback for Weechat configuration changes."""
weechat.prnt("", f"[Ollama] Configuration changed: {option} = {value}")
return weechat.WEECHAT_RC_OK
# Register configuration with /set
weechat.config_set_desc_plugin("highlight_response", "Automatically respond to mentions in channels (on/off)")
weechat.config_set_desc_plugin("pm_response", "Automatically respond to private messages (on/off)")
weechat.hook_config("plugins.var.python.ollama.highlight_response", "config_callback", "")
weechat.hook_config("plugins.var.python.ollama.pm_response", "config_callback", "")
# Register commands and hooks
weechat.hook_command("ollama", "Ask something to Ollama", "<question>", "Example: /ollama What is Python?", "", "command_ollama", "")
weechat.hook_print("", "notify_highlight", "", 1, "message_callback", "")
weechat.hook_print("", "notify_message", "", 1, "message_callback", "")
weechat.hook_print("", "notify_private", "", 1, "message_callback", "")