133 lines
5.1 KiB
Python
Executable File
133 lines
5.1 KiB
Python
Executable File
import weechat
|
|
import requests
|
|
import json
|
|
|
|
"""
|
|
Ollama Bot for WeeChat
|
|
|
|
This script automatically responds to mentions in channels and private messages using an Ollama LLM running locally.
|
|
|
|
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 locally at http://localhost:11434/api/generate
|
|
"""
|
|
|
|
# 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 = "http://localhost:11434/api/generate"
|
|
|
|
# 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", "prompt": message, "stream": False}
|
|
headers = {"Content-Type": "application/json"}
|
|
|
|
response = requests.post(
|
|
OLLAMA_API_URL,
|
|
json=data,
|
|
headers=headers,
|
|
verify=False # Change to True if you use a valid certificate
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
return f"Error {response.status_code}: {response.text}"
|
|
|
|
response_json = response.json()
|
|
return response_json.get("response", "No response received from Ollama.")
|
|
|
|
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."""
|
|
if not args:
|
|
weechat.prnt(buffer, "[Ollama] Usage: /ollama <question>")
|
|
return weechat.WEECHAT_RC_OK
|
|
|
|
response = ask_ollama(args)
|
|
weechat.prnt(buffer, f"[Ollama] {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", "")
|
|
|