mirror of
https://github.com/Myxelium/Lunaris2.0.git
synced 2026-04-13 16:10:36 +00:00
Compare commits
9 Commits
v0.1.0
...
Improve-ch
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f08d89f322 | ||
| b30d47e351 | |||
| 3ce0df7eaf | |||
| e88e67f913 | |||
| 5053553182 | |||
| 327ccc9675 | |||
| cbc99c2773 | |||
| d56215f685 | |||
| 967bee923a |
33
.github/workflows/dotnet.yml
vendored
33
.github/workflows/dotnet.yml
vendored
@@ -7,10 +7,13 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|
||||||
runs-on: windows-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # required for github-action-get-previous-tag
|
||||||
|
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@v1
|
uses: actions/setup-dotnet@v1
|
||||||
@@ -27,15 +30,19 @@ jobs:
|
|||||||
run: dotnet publish ./Bot/Lunaris2.csproj --configuration Release --output ./out
|
run: dotnet publish ./Bot/Lunaris2.csproj --configuration Release --output ./out
|
||||||
|
|
||||||
- name: Zip the build
|
- name: Zip the build
|
||||||
run: 7z a -tzip ./out/Bot.zip ./out/*
|
run: 7z a -tzip ./out/Lunaris.zip ./out/*
|
||||||
|
|
||||||
- name: Get the tag name
|
- name: Get previous tag
|
||||||
id: get_tag
|
id: previoustag
|
||||||
run: echo "::set-output name=tag::${GITHUB_REF#refs/tags/}"
|
uses: 'WyriHaximus/github-action-get-previous-tag@v1'
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Get the version
|
- name: Get next minor version
|
||||||
id: get_version
|
id: semver
|
||||||
run: echo "::set-output name=version::$(date +%s).${{ github.run_id }}"
|
uses: 'WyriHaximus/github-action-next-semvers@v1'
|
||||||
|
with:
|
||||||
|
version: ${{ steps.previoustag.outputs.tag }}
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
id: create_release
|
id: create_release
|
||||||
@@ -43,8 +50,8 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ steps.get_version.outputs.version }}
|
tag_name: ${{ steps.semver.outputs.patch }}
|
||||||
release_name: Release v${{ steps.get_version.outputs.version }}
|
release_name: Release ${{ steps.semver.outputs.patch }}
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
|
|
||||||
@@ -55,6 +62,6 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||||
asset_path: ./out/Bot.zip
|
asset_path: ./out/Lunaris.zip
|
||||||
asset_name: Bot.zip
|
asset_name: Lunaris.zip
|
||||||
asset_content_type: application/zip
|
asset_content_type: application/zip
|
||||||
|
|||||||
@@ -12,9 +12,11 @@ namespace Lunaris2.Handler.ChatCommand
|
|||||||
{
|
{
|
||||||
private readonly OllamaApiClient _ollama;
|
private readonly OllamaApiClient _ollama;
|
||||||
private readonly Dictionary<ulong, Chat?> _chatContexts = new();
|
private readonly Dictionary<ulong, Chat?> _chatContexts = new();
|
||||||
|
private readonly ChatSettings _chatSettings;
|
||||||
|
|
||||||
public ChatHandler(IOptions<ChatSettings> chatSettings)
|
public ChatHandler(IOptions<ChatSettings> chatSettings)
|
||||||
{
|
{
|
||||||
|
_chatSettings = chatSettings.Value;
|
||||||
var uri = new Uri(chatSettings.Value.Url);
|
var uri = new Uri(chatSettings.Value.Url);
|
||||||
|
|
||||||
_ollama = new OllamaApiClient(uri)
|
_ollama = new OllamaApiClient(uri)
|
||||||
@@ -29,6 +31,10 @@ namespace Lunaris2.Handler.ChatCommand
|
|||||||
_chatContexts.TryAdd(channelId, null);
|
_chatContexts.TryAdd(channelId, null);
|
||||||
|
|
||||||
var userMessage = command.FilteredMessage;
|
var userMessage = command.FilteredMessage;
|
||||||
|
|
||||||
|
var randomPersonality = _chatSettings.Personalities[new Random().Next(_chatSettings.Personalities.Count)];
|
||||||
|
|
||||||
|
userMessage = $"{randomPersonality.Instruction} {userMessage}";
|
||||||
|
|
||||||
using var setTyping = command.Message.Channel.EnterTypingState();
|
using var setTyping = command.Message.Channel.EnterTypingState();
|
||||||
|
|
||||||
|
|||||||
@@ -4,4 +4,11 @@ public class ChatSettings
|
|||||||
{
|
{
|
||||||
public string Url { get; set; }
|
public string Url { get; set; }
|
||||||
public string Model { get; set; }
|
public string Model { get; set; }
|
||||||
|
public List<Personality> Personalities { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Personality
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Instruction { get; set; }
|
||||||
}
|
}
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
<PackageReference Include="Discord.Net.Rest" Version="3.13.1" />
|
<PackageReference Include="Discord.Net.Rest" Version="3.13.1" />
|
||||||
<PackageReference Include="MediatR" Version="12.2.0" />
|
<PackageReference Include="MediatR" Version="12.2.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ public class Program
|
|||||||
.AddJsonFile("appsettings.json")
|
.AddJsonFile("appsettings.json")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
services.AddSingleton(client)
|
services
|
||||||
|
.AddSingleton(client)
|
||||||
.AddSingleton(commands)
|
.AddSingleton(commands)
|
||||||
.AddMediatR(configuration => configuration.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()))
|
.AddMediatR(configuration => configuration.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()))
|
||||||
.AddSingleton<DiscordEventListener>()
|
.AddSingleton<DiscordEventListener>()
|
||||||
|
|||||||
@@ -9,9 +9,15 @@
|
|||||||
"Token": "discordToken",
|
"Token": "discordToken",
|
||||||
"LavaLinkPassword": "youshallnotpass",
|
"LavaLinkPassword": "youshallnotpass",
|
||||||
"LavaLinkHostname": "127.0.0.1",
|
"LavaLinkHostname": "127.0.0.1",
|
||||||
"LavaLinkPort": 2333
|
"LavaLinkPort": 2333,
|
||||||
"LLM": {
|
"LLM": {
|
||||||
"Url": "http://192.168.50.54:11434",
|
"Url": "http://localhost:7869",
|
||||||
"Model": "gemma"
|
"Model": "gemma",
|
||||||
|
"personalities": [
|
||||||
|
{
|
||||||
|
"name": "Lunaris",
|
||||||
|
"instruction": "Let's role play. Your name is Lunaris and can be quite rude. You are supposed to answer on following question with a maximum of 2 sentences:"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -7,6 +7,7 @@ Lunaris2 is a Discord bot designed to play music in your server's voice channels
|
|||||||
- Play music from YouTube directly in your Discord server.
|
- Play music from YouTube directly in your Discord server.
|
||||||
- Skip tracks, pause, and resume playback.
|
- Skip tracks, pause, and resume playback.
|
||||||
- Queue system to line up your favorite tracks.
|
- Queue system to line up your favorite tracks.
|
||||||
|
- Local LLM (AI chatbot) that answers on @mentions in Discord chat. See more about it below.
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
@@ -17,6 +18,11 @@ Lunaris2 is a Discord bot designed to play music in your server's voice channels
|
|||||||
5. Make sure you got docker installed. And run the file ``start-services.sh``, make sure you got git-bash installed.
|
5. Make sure you got docker installed. And run the file ``start-services.sh``, make sure you got git-bash installed.
|
||||||
6. Now you can start the project and run the application.
|
6. Now you can start the project and run the application.
|
||||||
|
|
||||||
|
## LLM
|
||||||
|
Lunaris supports AI chat using a large language model, this is done by hosting the LLM locally, in this case Docker will set it up for you when you run the start-services script.
|
||||||
|
|
||||||
|
The LLM is run using Ollama see more about Ollama [here](https://ollama.com/). Running LLM locally requires much resources from your system, minimum requirements is at least 8GB of ram. If your don't have enought ram, select a LLM model in the [appsettings file](https://github.com/Myxelium/Lunaris2.0/blob/master/Bot/appsettings.json#L15) that requires less of your system.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
- `/play <song>`: Plays the specified song in the voice channel you're currently in.
|
- `/play <song>`: Plays the specified song in the voice channel you're currently in.
|
||||||
@@ -25,7 +31,3 @@ Lunaris2 is a Discord bot designed to play music in your server's voice channels
|
|||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
|
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](https://choosealicense.com/licenses/mit/)
|
|
||||||
|
|||||||
@@ -24,7 +24,52 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
# you only need this if you want to make your lavalink accessible from outside of containers
|
# you only need this if you want to make your lavalink accessible from outside of containers
|
||||||
- "2333:2333"
|
- "2333:2333"
|
||||||
|
|
||||||
|
ollama:
|
||||||
|
image: ollama/ollama:latest
|
||||||
|
ports:
|
||||||
|
- 7869:11434
|
||||||
|
volumes:
|
||||||
|
- .:/code
|
||||||
|
- ./ollama/ollama:/root/.ollama
|
||||||
|
container_name: ollama
|
||||||
|
pull_policy: always
|
||||||
|
tty: true
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- OLLAMA_KEEP_ALIVE=24h
|
||||||
|
- OLLAMA_HOST=0.0.0.0
|
||||||
|
networks:
|
||||||
|
- ollama-docker
|
||||||
|
|
||||||
|
ollama-webui:
|
||||||
|
image: ghcr.io/open-webui/open-webui:main
|
||||||
|
container_name: ollama-webui
|
||||||
|
volumes:
|
||||||
|
- ./ollama/ollama-webui:/app/backend/data
|
||||||
|
depends_on:
|
||||||
|
- ollama
|
||||||
|
ports:
|
||||||
|
- 8080:8080
|
||||||
|
environment: # https://docs.openwebui.com/getting-started/env-configuration#default_models
|
||||||
|
- OLLAMA_BASE_URLS=http://host.docker.internal:7869 #comma separated ollama hosts
|
||||||
|
- ENV=dev
|
||||||
|
- WEBUI_AUTH=False
|
||||||
|
- WEBUI_NAME=valiantlynx AI
|
||||||
|
- WEBUI_URL=http://localhost:8080
|
||||||
|
- WEBUI_SECRET_KEY=t0p-s3cr3t
|
||||||
|
extra_hosts:
|
||||||
|
- host.docker.internal:host-gateway
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- ollama-docker
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
ollama: {}
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
# create a lavalink network you can add other containers to, to give them access to Lavalink
|
# create a lavalink network you can add other containers to, to give them access to Lavalink
|
||||||
lavalink:
|
lavalink:
|
||||||
name: lavalink
|
name: lavalink
|
||||||
|
ollama-docker:
|
||||||
|
external: false
|
||||||
@@ -1 +1,3 @@
|
|||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
|
||||||
|
read -p "Press enter to continue"
|
||||||
|
|||||||
Reference in New Issue
Block a user