improvements. added config.json, help.txt, etc
This commit is contained in:
parent
2116ea9556
commit
56ec34f242
@ -9,7 +9,7 @@ Terminal-based version at [ollamarama](https://github.com/h1ddenpr0cess20/ollama
|
|||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
Install and familiarize yourself with [Ollama](https://ollama.ai/), make sure you can run offline LLMs, etc.
|
Install and familiarize yourself with [Ollama](https://ollama.ai/), make sure you can run local LLMs, etc.
|
||||||
|
|
||||||
You can install and update it with this command:
|
You can install and update it with this command:
|
||||||
```
|
```
|
||||||
@ -17,7 +17,7 @@ curl https://ollama.ai/install.sh | sh
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Once it's all set up, you'll need to [download the models](https://ollama.ai/library) you want to use. You can play with the available ones and see what works best for you. Add those to the models.json file. If you want to use the ones I've included, just run ollama pull _modelname_ for each. You can skip this part, and they should download when the model is switched, but the response will be delayed until it finishes downloading.
|
Once it's all set up, you'll need to [download the models](https://ollama.ai/library) you want to use. You can play with the available ones and see what works best for you. Add those to the config.json file. If you want to use the ones I've included, just run ollama pull _modelname_ for each. You can skip this part, and they should download when the model is switched, but the response will be delayed until it finishes downloading.
|
||||||
|
|
||||||
|
|
||||||
You'll also need to install matrix-nio and litellm
|
You'll also need to install matrix-nio and litellm
|
||||||
@ -27,10 +27,10 @@ pip3 install matrix-nio litellm
|
|||||||
|
|
||||||
Set up a [Matrix account](https://app.element.io/) for your bot. You'll need the server, username and password.
|
Set up a [Matrix account](https://app.element.io/) for your bot. You'll need the server, username and password.
|
||||||
|
|
||||||
Plug those into the appropriate variables in the launcher.py file.
|
Plug those into the appropriate variables in the config.json file.
|
||||||
|
|
||||||
```
|
```
|
||||||
python3 launcher.py
|
python3 ollamarama.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## Use
|
## Use
|
||||||
|
36
config.json
Normal file
36
config.json
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"llama3": "ollama/llama3",
|
||||||
|
"wizardlm2": "ollama/wizardlm2",
|
||||||
|
"phi3": "ollama/phi3",
|
||||||
|
"zephyr": "ollama/zephyr",
|
||||||
|
"solar": "ollama/solar",
|
||||||
|
"mistral": "ollama/mistral",
|
||||||
|
"codellama": "ollama/codellama",
|
||||||
|
"dolphin-mistral": "ollama/dolphin-mistral",
|
||||||
|
"dolphin-llama3": "dolphin-llama3",
|
||||||
|
"gemma": "ollama/gemma",
|
||||||
|
"codegemma": "ollama/codegemma"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"server": "https://matrix.org",
|
||||||
|
"username": "@USERNAME:SERVER.TLD",
|
||||||
|
"password": "PASSWORD",
|
||||||
|
|
||||||
|
"channels":
|
||||||
|
[
|
||||||
|
"#channel1:SERVER.TLD",
|
||||||
|
"#channel2:SERVER.TLD",
|
||||||
|
"#channel3:SERVER.TLD",
|
||||||
|
"!ExAmPleOfApRivAtErOoM:SERVER.TLD"
|
||||||
|
],
|
||||||
|
|
||||||
|
"personality": "a helpful and thorough AI assistant who provides accurate and detailed answers without being too verbose",
|
||||||
|
"admins":
|
||||||
|
[
|
||||||
|
"admin_nick1",
|
||||||
|
"admin_nick2"
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
57
help.txt
Normal file
57
help.txt
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
.ai <message> or botname: <message>
|
||||||
|
Basic usage.
|
||||||
|
Personality is preset by bot operator.
|
||||||
|
|
||||||
|
.x <user> <message>
|
||||||
|
This allows you to talk to another user's chat history.
|
||||||
|
<user> is the display name of the user whose history you want to use
|
||||||
|
|
||||||
|
.persona <personality type or character or inanimate object>
|
||||||
|
Changes the personality. It can be a character, personality type, object, idea.
|
||||||
|
|
||||||
|
.custom <custom prompt>
|
||||||
|
Allows use of a custom system prompt instead of the roleplaying prompt
|
||||||
|
|
||||||
|
.reset
|
||||||
|
Reset to preset personality
|
||||||
|
|
||||||
|
.stock
|
||||||
|
Remove personality and reset to standard model settings
|
||||||
|
|
||||||
|
|
||||||
|
Available at https://github.com/h1ddenpr0cess20/ollamarama-matrix
|
||||||
|
|
||||||
|
~~~
|
||||||
|
|
||||||
|
.admins
|
||||||
|
List of users authorized to use these commands
|
||||||
|
|
||||||
|
.models
|
||||||
|
List available models
|
||||||
|
|
||||||
|
.model <model>
|
||||||
|
Change the model
|
||||||
|
|
||||||
|
.temperature <#>
|
||||||
|
Set temperature value between 0 and 1. To reset to default, type reset instead of a number. (bot owner only)
|
||||||
|
|
||||||
|
.top_p <#>
|
||||||
|
Set top_p value between 0 and 1. To reset to default, type reset instead of a number. (bot owner only)
|
||||||
|
|
||||||
|
.repeat_penalty <#>
|
||||||
|
Set repeat_penalty between 0 and 2. To reset to default, type reset instead of a number. (bot owner only)
|
||||||
|
|
||||||
|
.clear
|
||||||
|
Reset bot for everyone (bot owner only)
|
||||||
|
|
||||||
|
.gpersona <personality>
|
||||||
|
Change default global personality (bot owner only)
|
||||||
|
|
||||||
|
.gpersona reset
|
||||||
|
Reset global personality (bot owner only)
|
||||||
|
|
||||||
|
.auth <user>
|
||||||
|
Add an admin (bot owner only)
|
||||||
|
|
||||||
|
.deauth <user>
|
||||||
|
Remove an admin (bot owner only)
|
24
launcher.py
24
launcher.py
@ -1,24 +0,0 @@
|
|||||||
import asyncio
|
|
||||||
from ollamarama import ollamarama
|
|
||||||
|
|
||||||
|
|
||||||
server = "https://matrix.org" #change if using different homeserver
|
|
||||||
username = "@USERNAME:SERVER.TLD"
|
|
||||||
password = "PASSWORD"
|
|
||||||
|
|
||||||
channels = ["#channel1:SERVER.TLD",
|
|
||||||
"#channel2:SERVER.TLD",
|
|
||||||
"#channel3:SERVER.TLD",
|
|
||||||
"!ExAmPleOfApRivAtErOoM:SERVER.TLD", ] #enter the channels you want it to join here
|
|
||||||
|
|
||||||
|
|
||||||
personality = "a helpful and thorough AI assistant who provides accurate and detailed answers without being too verbose"
|
|
||||||
|
|
||||||
#users authorized to use special commands
|
|
||||||
admins = ['BOTOWNER',]
|
|
||||||
|
|
||||||
# create bot instance
|
|
||||||
bot = ollamarama(server, username, password, channels, personality, admins)
|
|
||||||
|
|
||||||
# run main function loop
|
|
||||||
asyncio.get_event_loop().run_until_complete(bot.main())
|
|
107
ollamarama.py
107
ollamarama.py
@ -5,11 +5,11 @@ Author: Dustin Whyte
|
|||||||
Date: December 2023
|
Date: December 2023
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
|
||||||
from nio import AsyncClient, MatrixRoom, RoomMessageText
|
from nio import AsyncClient, MatrixRoom, RoomMessageText
|
||||||
import datetime
|
|
||||||
from litellm import completion
|
from litellm import completion
|
||||||
import json
|
import json
|
||||||
|
import datetime
|
||||||
|
import asyncio
|
||||||
|
|
||||||
class ollamarama:
|
class ollamarama:
|
||||||
def __init__(self, server, username, password, channels, personality, admins):
|
def __init__(self, server, username, password, channels, personality, admins):
|
||||||
@ -29,15 +29,14 @@ class ollamarama:
|
|||||||
self.messages = {}
|
self.messages = {}
|
||||||
|
|
||||||
#prompt parts
|
#prompt parts
|
||||||
self.prompt = ("you are ", ". speak in the first person and never break character.")
|
self.prompt = ("you are ", ". roleplay and speak in the first person and never break character.")
|
||||||
|
|
||||||
#open models.json
|
#open models.json
|
||||||
with open("models.json", "r") as f:
|
with open("config.json", "r") as f:
|
||||||
self.models = json.load(f)
|
self.models = json.load(f)[0]
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
#set model
|
#set model
|
||||||
self.default_model = self.models['zephyr']
|
self.default_model = self.models['llama3']
|
||||||
self.model = self.default_model
|
self.model = self.default_model
|
||||||
|
|
||||||
#no idea if optimal, change if necessary
|
#no idea if optimal, change if necessary
|
||||||
@ -48,6 +47,11 @@ class ollamarama:
|
|||||||
#authorized users for changing models
|
#authorized users for changing models
|
||||||
self.admins = admins
|
self.admins = admins
|
||||||
|
|
||||||
|
#load help menu
|
||||||
|
with open("help.txt", "r") as f:
|
||||||
|
self.help, self.help_admin = f.read().split("~~~")
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
# get the display name for a user
|
# get the display name for a user
|
||||||
async def display_name(self, user):
|
async def display_name(self, user):
|
||||||
@ -152,7 +156,6 @@ class ollamarama:
|
|||||||
|
|
||||||
# tracks the messages in channels
|
# tracks the messages in channels
|
||||||
async def message_callback(self, room: MatrixRoom, event: RoomMessageText):
|
async def message_callback(self, room: MatrixRoom, event: RoomMessageText):
|
||||||
|
|
||||||
# Main bot functionality
|
# Main bot functionality
|
||||||
if isinstance(event, RoomMessageText):
|
if isinstance(event, RoomMessageText):
|
||||||
# convert timestamp
|
# convert timestamp
|
||||||
@ -175,8 +178,8 @@ class ollamarama:
|
|||||||
#model switching
|
#model switching
|
||||||
if message.startswith(".model"):
|
if message.startswith(".model"):
|
||||||
if message == ".models":
|
if message == ".models":
|
||||||
await self.send_message(room_id, f'''Current model: {self.model.removeprefix('ollama/')}
|
current_model = f"Current model: {self.model.removeprefix('ollama/')}\nAvailable models: {', '.join(sorted(list(self.models)))}"
|
||||||
Available models: {', '.join(sorted(list(self.models)))}''')
|
await self.send_message(room_id, current_model)
|
||||||
|
|
||||||
if message.startswith(".model "):
|
if message.startswith(".model "):
|
||||||
m = message.split(" ", 1)[1]
|
m = message.split(" ", 1)[1]
|
||||||
@ -346,71 +349,9 @@ Available models: {', '.join(sorted(list(self.models)))}''')
|
|||||||
|
|
||||||
# help menu
|
# help menu
|
||||||
if message.startswith(".help"):
|
if message.startswith(".help"):
|
||||||
await self.send_message(room_id,
|
await self.send_message(room_id, self.help)
|
||||||
f'''{self.bot_id}, an AI chatbot.
|
|
||||||
|
|
||||||
.ai <message> or {self.bot_id}: <message>
|
|
||||||
Basic usage.
|
|
||||||
Personality is preset by bot operator.
|
|
||||||
|
|
||||||
.x <user> <message>
|
|
||||||
This allows you to talk to another user's chat history.
|
|
||||||
<user> is the display name of the user whose history you want to use
|
|
||||||
|
|
||||||
.persona <personality type or character or inanimate object>
|
|
||||||
Changes the personality. It can be a character, personality type, object, idea.
|
|
||||||
|
|
||||||
.custom <custom prompt>
|
|
||||||
Allows use of a custom system prompt instead of the roleplaying prompt
|
|
||||||
|
|
||||||
.reset
|
|
||||||
Reset to preset personality
|
|
||||||
|
|
||||||
.stock
|
|
||||||
Remove personality and reset to standard model settings
|
|
||||||
|
|
||||||
|
|
||||||
Available at https://github.com/h1ddenpr0cess20/ollamarama-matrix
|
|
||||||
|
|
||||||
''')
|
|
||||||
if sender_display in self.admins:
|
if sender_display in self.admins:
|
||||||
await self.send_message(room_id, '''Admin commands:
|
await self.send_message(room_id, self.help_admin)
|
||||||
|
|
||||||
.admins
|
|
||||||
List of users authorized to use these commands
|
|
||||||
|
|
||||||
.models
|
|
||||||
List available models
|
|
||||||
|
|
||||||
.model <model>
|
|
||||||
Change the model
|
|
||||||
|
|
||||||
.temperature <#>
|
|
||||||
Set temperature value between 0 and 1. To reset to default, type reset instead of a number. (bot owner only)
|
|
||||||
|
|
||||||
.top_p <#>
|
|
||||||
Set top_p value between 0 and 1. To reset to default, type reset instead of a number. (bot owner only)
|
|
||||||
|
|
||||||
.repeat_penalty <#>
|
|
||||||
Set repeat_penalty between 0 and 2. To reset to default, type reset instead of a number. (bot owner only)
|
|
||||||
|
|
||||||
.clear
|
|
||||||
Reset bot for everyone (bot owner only)
|
|
||||||
|
|
||||||
.gpersona <personality>
|
|
||||||
Change default global personality (bot owner only)
|
|
||||||
|
|
||||||
.gpersona reset
|
|
||||||
Reset global personality (bot owner only)
|
|
||||||
|
|
||||||
.auth <user>
|
|
||||||
Add an admin (bot owner only)
|
|
||||||
|
|
||||||
.deauth <user>
|
|
||||||
Remove an admin (bot owner only)
|
|
||||||
|
|
||||||
''')
|
|
||||||
|
|
||||||
|
|
||||||
# main loop
|
# main loop
|
||||||
async def main(self):
|
async def main(self):
|
||||||
@ -435,20 +376,12 @@ Available at https://github.com/h1ddenpr0cess20/ollamarama-matrix
|
|||||||
await self.client.sync_forever(timeout=30000)
|
await self.client.sync_forever(timeout=30000)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
#load config file
|
||||||
|
with open("config.json", "r") as f:
|
||||||
|
config = json.load(f)
|
||||||
|
f.close()
|
||||||
|
|
||||||
server = "https://matrix.org" #change if using different homeserver
|
server, username, password, channels, personality, admins = config[1].values()
|
||||||
username = "@USERNAME:SERVER.TLD"
|
|
||||||
password = "PASSWORD"
|
|
||||||
|
|
||||||
channels = ["#channel1:SERVER.TLD",
|
|
||||||
"#channel2:SERVER.TLD",
|
|
||||||
"#channel3:SERVER.TLD",
|
|
||||||
"!ExAmPleOfApRivAtErOoM:SERVER.TLD", ] #enter the channels you want it to join here
|
|
||||||
|
|
||||||
personality = "a helpful and thorough AI assistant who provides accurate and detailed answers without being too verbose"
|
|
||||||
|
|
||||||
#list of authorized users for admin commands
|
|
||||||
admins = ['admin_nick1', 'admin_nick2',]
|
|
||||||
|
|
||||||
# create bot instance
|
# create bot instance
|
||||||
bot = ollamarama(server, username, password, channels, personality, admins)
|
bot = ollamarama(server, username, password, channels, personality, admins)
|
||||||
|
Loading…
Reference in New Issue
Block a user