Matteo Subet commited on
Commit
5606f58
·
1 Parent(s): 4eb5c8c

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +208 -0
app.py ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import discord
2
+ from discord import File
3
+ from discord.ext import commands
4
+ from gradio_client import Client
5
+ import os
6
+ import sys
7
+ import gradio as gr
8
+
9
+ with gr.Blocks() as demo:
10
+ gr.Markdown("NinoBot machine is working...")
11
+
12
+ ninoToken = os.getenv('ninoToken')
13
+
14
+ # Initialize the bot with the intents
15
+ intents = discord.Intents.default()
16
+ intents.members = True
17
+ intents.messages = True
18
+
19
+ #Pass the intent variables to the bot
20
+ bot = discord.Bot(intents=intents)
21
+
22
+ # Function that is called as soon as the bot is ready
23
+ @bot.event
24
+ async def on_ready():
25
+ global clientMAGNeT, magnetAvailable, clientLLaMa, llamaAvailable
26
+
27
+ try:
28
+ clientMAGNeT = Client("https://fffiloni-magnet.hf.space/--replicas/58jap/")
29
+ magnetAvailable = True
30
+ except Exception as e:
31
+ print(f"Failed to connect to MAGNet: {str(e)}")
32
+ magnetAvailable = False
33
+
34
+ try:
35
+ clientLLaMa = Client("https://ysharma-explore-llamav2-with-tgi.hf.space/--replicas/brc3o/")
36
+ llamaAvailable = True
37
+ except Exception as e:
38
+ print(f"Failed to connect to MAGNet: {str(e)}")
39
+ llamaAvailable = False
40
+
41
+ print(f'{bot.user} has connected to Discord!')
42
+
43
+ # Function to trigger the command /ninowrite
44
+ @bot.command(name="ninowrite", description="Send a message with Nino to a specific channel")
45
+ @commands.has_role(1121063615106142329)
46
+ # pycord will figure out the types for you
47
+ async def ninowrite(ctx, channel: discord.TextChannel, message: discord.Option(str, "Enter your message")):
48
+ await channel.send(message)
49
+ await ctx.respond(f'<:NinoBlue:1205472560842539028> successfuly sent the message `{message}` sent to <#{channel.id}> !')
50
+
51
+ # Check for errors in the /ninowrite command
52
+ @ninowrite.error
53
+ async def your_command_error(ctx, error):
54
+ if isinstance(error, commands.CheckFailure):
55
+ await ctx.respond("You can use the `/ninotalk` command only if you are part of <@&1121063615106142329>", ephemeral=True)
56
+
57
+ # Function to trigger the command /ninoplay
58
+ @bot.command(name="ninoplay", description="Generate audio tracks from text")
59
+ @commands.check_any(commands.has_role(1121063615106142329), commands.has_role(1204421985443258498))
60
+ async def ninoplay(ctx,
61
+ model: discord.Option(str, "Choose your model", choices=["facebook/magnet-small-10secs", "facebook/magnet-medium-10secs", "facebook/magnet-small-30secs", "facebook/magnet-medium-30secs", "facebook/audio-magnet-small", "facebook/audio-magnet-medium"]),
62
+ prompt: discord.Option(str, "Enter your prompt"),
63
+ temperature: discord.Option(float, "Temperature", choices=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])):
64
+ if magnetAvailable:
65
+ await ctx.respond(f'<:NinoBlue:1205472560842539028> successfuly added in queue!\nYour audio generation with the prompt `{prompt}` using the model `{model}` with the temperature `{temperature}` has started, in approx. 45s will be available!', ephemeral=True)
66
+ result = clientMAGNeT.predict(
67
+ model, # Literal['facebook/magnet-small-10secs', 'facebook/magnet-medium-10secs', 'facebook/magnet-small-30secs', 'facebook/magnet-medium-30secs', 'facebook/audio-magnet-small', 'facebook/audio-magnet-medium'] in 'Model' Radio component
68
+ "", # str in 'Model Path (custom models)' Textbox component
69
+ prompt, # str in 'Input Text' Textbox component
70
+ temperature, # float in 'Temperature' Number component
71
+ 0.9, # float in 'Top-p' Number component
72
+ 10, # float in 'Max CFG coefficient' Number component
73
+ 1, # float in 'Min CFG coefficient' Number component
74
+ 20, # float in 'Decoding Steps (stage 1)' Number component
75
+ 10, # float in 'Decoding Steps (stage 2)' Number component
76
+ 10, # float in 'Decoding Steps (stage 3)' Number component
77
+ 10, # float in 'Decoding Steps (stage 4)' Number component
78
+ "prod-stride1 (new!)", # Literal['max-nonoverlap', 'prod-stride1 (new!)'] in 'Span Scoring' Radio component
79
+ api_name="/predict_full"
80
+ )
81
+
82
+ print(f"{prompt} from {ctx.author} generated!")
83
+
84
+ # Format the result paths
85
+ parent_folders = []
86
+ result_paths = []
87
+ if isinstance(result[0], dict):
88
+ for key, value in result[0].items():
89
+ if key != "subtitles":
90
+ os.remove(value)
91
+ os.rmdir(os.path.dirname(value))
92
+ for path in result[1:]:
93
+ result_paths.append(path)
94
+
95
+ try:
96
+ await ctx.respond(f"<:NinoBlue:1205472560842539028> `{prompt}` generated using the MAGNeT model `{model}` by <@{ctx.author.id}>")
97
+ for index, path in enumerate(result_paths):
98
+ with open(path, 'rb') as fp:
99
+ await ctx.followup.send(file=File(fp, f"{prompt}_{ctx.author}_output_{index}.wav"))
100
+ os.remove(path)
101
+ parent_folders.append(os.path.dirname(path))
102
+
103
+ for folder in parent_folders:
104
+ os.rmdir(folder)
105
+
106
+ except Exception as e:
107
+ await ctx.respond(f"Failed to send the audio file: {str(e)}", ephemeral=True)
108
+ else:
109
+ await ctx.respond("The MAGNeT service is currently unavailable, please try again later.", ephemeral=True)
110
+
111
+ # Check for errors in the /ninoplay command
112
+ @ninoplay.error
113
+ async def your_command_error(ctx, error):
114
+ if isinstance(error, commands.CheckFailure):
115
+ await ctx.respond("You can use the `/ninoaudio` command only if you are part of <@&1121063615106142329> or <@&1121063615106142329>", ephemeral=True)
116
+
117
+ # Function to trigger the command /ninochat
118
+ @bot.command(name="ninochat", description="Nino LLm chatbot based on LLaMa")
119
+ @commands.check_any(commands.has_role(1121063615106142329), commands.has_role(1204421985443258498))
120
+ async def ninochat(ctx,
121
+ model: discord.Option(str, "Choose your model", choices=["llama-2-70b-chat"]),
122
+ prompt: discord.Option(str, "Enter your prompt"),
123
+ temperature: discord.Option(float, "Temperature", choices=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])):
124
+ if llamaAvailable:
125
+ await ctx.respond(f'<:NinoBlue:1205472560842539028> successfuly added in queue!\nYour text with the prompt `{prompt}` using the model `{model}` and with the temperature `{temperature}` has started, in approx. 24s will be available!', ephemeral=True)
126
+
127
+ result = clientLLaMa.predict(
128
+ prompt, # str in 'parameter_7' Textbox component
129
+ "", # str in 'Optional system prompt' Textbox component
130
+ temperature, # float (numeric value between 0.0 and 1.0) in 'Temperature' Slider component
131
+ 1024, # float (numeric value between 0 and 4096) in 'Max new tokens' Slider component
132
+ 0.9, # float (numeric value between 0.0 and 1) in 'Top-p (nucleus sampling)' Slider component
133
+ 1.2, # float (numeric value between 1.0 and 2.0) in 'Repetition penalty' Slider component
134
+ api_name="/chat"
135
+ )
136
+
137
+ print(f"{prompt} from {ctx.author} generated!")
138
+
139
+ try:
140
+ message_prefix = f"<:NinoBlue:1205472560842539028> the answer to the <@{ctx.author.id}>:\n"
141
+ max_length = 2000 - len(message_prefix) - 10
142
+ chunks = [result[i:i+max_length] for i in range(0, len(result), max_length)]
143
+ await ctx.respond(message_prefix)
144
+ for chunk in chunks:
145
+ await ctx.followup.send(f"{chunk}\n")
146
+ except Exception as e:
147
+ await ctx.respond(f"Failed to retrieve the answer: {str(e)}", ephemeral=True)
148
+ else:
149
+ await ctx.respond("The LLaMa service is currently unavailable, please try again later.", ephemeral=True)
150
+
151
+ # Check for errors in the /ninochat command
152
+ @ninochat.error
153
+ async def your_command_error(ctx, error):
154
+ if isinstance(error, commands.CheckFailure):
155
+ await ctx.respond("You can use the `/ninochat` command only if you are part of <@&1121063615106142329> or <@&1121063615106142329>", ephemeral=True)
156
+
157
+ # Function to trigger the command /restart
158
+ @bot.command(name="restart", description="Restart the bot")
159
+ @commands.has_role(1121063615106142329)
160
+ async def restart(ctx):
161
+ await ctx.send("I'm taking a power nap! <:NinoBlue:1205472560842539028>\nI'll be back in a moment!")
162
+ await bot.logout()
163
+ await bot.close()
164
+ python = sys.executable
165
+ os.execl(python, python, *sys.argv)
166
+
167
+ # Check for errors in the /ninochat command
168
+ @restart.error
169
+ async def your_command_error(ctx, error):
170
+ if isinstance(error, commands.CheckFailure):
171
+ await ctx.respond("You can use the `/restart` command only if you are part of <@&1121063615106142329>", ephemeral=True)
172
+
173
+ # Function that is triggered when a member joins the server
174
+ @bot.event
175
+ async def on_member_join(member):
176
+ channel = discord.utils.get(member.guild.text_channels, name="🤖┊bot")
177
+
178
+ if channel: # Ensure the channel was found
179
+ await channel.send(f"Ciao, {member.mention}! It's a pleasure to have you here! <:NinoBlue:1205472560842539028>")
180
+ else:
181
+ print("The channel 🤖┊bot was not found.")
182
+
183
+ # Function that is triggered when a member send a message
184
+ @bot.event
185
+ async def on_message(message):
186
+ # Don't let the bot react to its own messages.
187
+ if message.author == bot.user:
188
+ return
189
+
190
+ # Check if the message is in the specific channel.
191
+ if message.channel.name == "🌍┊risorse":
192
+ emoji = discord.utils.get(bot.emojis, id=1205472560842539028)
193
+ if emoji: # If the emoji was found
194
+ try:
195
+ await message.add_reaction(emoji)
196
+ except discord.HTTPException as e:
197
+ print(f"Failed to add reaction: {e}")
198
+ else:
199
+ print("Emoji not found.")
200
+
201
+ if message.channel.name == "🚀┊risultati":
202
+ await message.add_reaction("🚀")
203
+
204
+ demo.launch()
205
+
206
+ # -----------------------------------------------------------
207
+ # Run the bot in a loop
208
+ bot.run(ninoToken)