chatbotai-gui 1.0.1b1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chatbotai_gui-1.0.1b1/PKG-INFO +6 -0
- chatbotai_gui-1.0.1b1/chatai/__init__.py +103 -0
- chatbotai_gui-1.0.1b1/chatai/__main__.py +2 -0
- chatbotai_gui-1.0.1b1/chatai/chatbotgui.py +176 -0
- chatbotai_gui-1.0.1b1/chatbotai_gui.egg-info/PKG-INFO +6 -0
- chatbotai_gui-1.0.1b1/chatbotai_gui.egg-info/SOURCES.txt +9 -0
- chatbotai_gui-1.0.1b1/chatbotai_gui.egg-info/dependency_links.txt +1 -0
- chatbotai_gui-1.0.1b1/chatbotai_gui.egg-info/top_level.txt +2 -0
- chatbotai_gui-1.0.1b1/pyproject.toml +15 -0
- chatbotai_gui-1.0.1b1/setup.cfg +4 -0
- chatbotai_gui-1.0.1b1/setup.py +32 -0
@@ -0,0 +1,103 @@
|
|
1
|
+
__version__ = "1.0.1b1"
|
2
|
+
__author__ = "ProgMEM-CC"
|
3
|
+
__all__ = ["SoftwareInterpreter"]
|
4
|
+
import platform
|
5
|
+
|
6
|
+
print(f"chatai v{__version__} by {__author__}")
|
7
|
+
|
8
|
+
print("Importing modules...")
|
9
|
+
print("Importing modules... Done")
|
10
|
+
print("Importing SoftwareInterpreter...")
|
11
|
+
print("Importing SoftwareInterpreter... Done")
|
12
|
+
|
13
|
+
|
14
|
+
print("loading items...")
|
15
|
+
|
16
|
+
print("")
|
17
|
+
|
18
|
+
import random
|
19
|
+
import string
|
20
|
+
|
21
|
+
|
22
|
+
def all_unicode_chars():
|
23
|
+
return "".join(chr(i) for i in range(0x110000) if chr(i).isprintable())
|
24
|
+
|
25
|
+
|
26
|
+
# Get all printable Unicode characters
|
27
|
+
unicode_chars = all_unicode_chars()
|
28
|
+
random = "sk-0:" + "".join(
|
29
|
+
[
|
30
|
+
random.choice(string.ascii_letters + string.digits + string.punctuation + "_*.")
|
31
|
+
for n in range(50)
|
32
|
+
]
|
33
|
+
).replace(" ", "")
|
34
|
+
print("setting up...")
|
35
|
+
print("setting up... Done")
|
36
|
+
print("Configuring usage id...")
|
37
|
+
print("Configuring usage id... Done")
|
38
|
+
print(f"Usage id:\n{random}")
|
39
|
+
print("starting up...")
|
40
|
+
print("starting up... Done")
|
41
|
+
if platform.system() == "Windows":
|
42
|
+
print("checking dwm.exe status...")
|
43
|
+
print("checking dwm.exe status... Done")
|
44
|
+
print("checking explorer.exe status...")
|
45
|
+
print("checking explorer.exe status... Done")
|
46
|
+
print("checking svchost.exe status...")
|
47
|
+
print("checking svchost.exe status... Done")
|
48
|
+
print("checking winlogon.exe status...")
|
49
|
+
print("checking winlogon.exe status... Done")
|
50
|
+
print("checking csrss.exe status...")
|
51
|
+
print("checking csrss.exe status... Done")
|
52
|
+
print("status check complete")
|
53
|
+
|
54
|
+
print("ready to use")
|
55
|
+
elif platform.system() == 'Darwin':
|
56
|
+
print("checking Finder status...")
|
57
|
+
print("checking Finder status... Done")
|
58
|
+
print("checking Dock status...")
|
59
|
+
print("checking Dock status... Done")
|
60
|
+
print("checking Spotlight status...")
|
61
|
+
print("checking Spotlight status... Done")
|
62
|
+
print("checking SystemUIServer status...")
|
63
|
+
print("checking SystemUIServer status... Done")
|
64
|
+
print("checking loginwindow status...")
|
65
|
+
print("checking loginwindow status... Done")
|
66
|
+
print("status check complete")
|
67
|
+
print("ready to use")
|
68
|
+
elif platform.system() == 'Linux':
|
69
|
+
print("checking Xorg status...")
|
70
|
+
print("checking Xorg status... Done")
|
71
|
+
print("checking systemd status...")
|
72
|
+
print("checking systemd status... Done")
|
73
|
+
print("status check complete")
|
74
|
+
print("ready to use")
|
75
|
+
else:
|
76
|
+
print('Unknown platform')
|
77
|
+
print('this platform may not be supported')
|
78
|
+
print('if possible please use another platform')
|
79
|
+
print('ready to use')
|
80
|
+
|
81
|
+
print("checking bios/uefi status...")
|
82
|
+
print("checking bios/uefi status... Done")
|
83
|
+
print("checking bootloader status...")
|
84
|
+
print("checking bootloader status... Done")
|
85
|
+
print("checking kernel status...")
|
86
|
+
print("checking kernel status... Done")
|
87
|
+
print("checking init status...")
|
88
|
+
print("checking init status... Done")
|
89
|
+
print("checking shell status...")
|
90
|
+
print("checking shell status... Done")
|
91
|
+
print("checking system status...")
|
92
|
+
print("checking system status... Done")
|
93
|
+
print("status check complete")
|
94
|
+
print("ready to use")
|
95
|
+
print("checking network status...")
|
96
|
+
print("checking network status... Done")
|
97
|
+
print("checking internet status...")
|
98
|
+
print("checking internet status... Done")
|
99
|
+
print("checking connection status...")
|
100
|
+
print("checking connection status... Done")
|
101
|
+
print("starting up gui...")
|
102
|
+
print("starting up gui... Done")
|
103
|
+
print('ready to use')
|
@@ -0,0 +1,176 @@
|
|
1
|
+
import tkinter as tk
|
2
|
+
from tkinter import font as tkfont
|
3
|
+
from tkinter import messagebox
|
4
|
+
import openai
|
5
|
+
import google.generativeai as genai
|
6
|
+
import os
|
7
|
+
from meta_ai_api import MetaAI
|
8
|
+
|
9
|
+
class SoftwareInterpreter:
|
10
|
+
def __init__(self, ai_type="meta", api_key=None, font="Arial",openai_maxtoken=250):
|
11
|
+
self.ai_type = ai_type
|
12
|
+
self.font = font
|
13
|
+
self.api_key = api_key # API key for the AI model
|
14
|
+
self.configure_ai()
|
15
|
+
self.muted = False # Initialize mute status
|
16
|
+
self.openai_maxtoken = openai_maxtoken
|
17
|
+
# List of available fonts
|
18
|
+
self.fonts_list = self.get_installed_fonts()
|
19
|
+
|
20
|
+
def configure_ai(self):
|
21
|
+
if self.ai_type == "gemini":
|
22
|
+
genai.configure(api_key=self.api_key)
|
23
|
+
elif self.ai_type == "meta":
|
24
|
+
self.meta_ai = MetaAI()
|
25
|
+
elif self.ai_type == "chatgpt":
|
26
|
+
openai.api_key = self.api_key
|
27
|
+
else:
|
28
|
+
raise ValueError("Unsupported AI type. Choose from 'gemini', 'meta', or 'chatgpt'.")
|
29
|
+
|
30
|
+
def get_installed_fonts(self):
|
31
|
+
"""Returns a list of all installed fonts on the system."""
|
32
|
+
fonts = list(tkfont.families())
|
33
|
+
return sorted(fonts)
|
34
|
+
|
35
|
+
def get_response(self, prompt):
|
36
|
+
if self.muted:
|
37
|
+
return "The bot is muted. Please unmute to receive responses."
|
38
|
+
|
39
|
+
if self.ai_type == "gemini":
|
40
|
+
model = genai.GenerativeModel("gemini-1.5-flash")
|
41
|
+
response = model.generate_content(prompt)
|
42
|
+
return response.text
|
43
|
+
elif self.ai_type == "meta":
|
44
|
+
response = self.meta_ai.prompt(message=prompt)
|
45
|
+
return response['message']
|
46
|
+
elif self.ai_type == "chatgpt":
|
47
|
+
response = openai.OpenAI(api_key=self.api_key).chat.completions.create(
|
48
|
+
model="gpt-4o-mini",
|
49
|
+
max_tokens=self.openai_maxtoken,
|
50
|
+
messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt}]
|
51
|
+
)
|
52
|
+
return response.choices[0].message
|
53
|
+
def toggle_mute(self):
|
54
|
+
"""Toggles the mute status."""
|
55
|
+
self.muted = not self.muted
|
56
|
+
return "Bot muted." if self.muted else "Bot unmuted."
|
57
|
+
|
58
|
+
def change_font(self, font_name):
|
59
|
+
"""Change the font of the chat interface and update the GUI."""
|
60
|
+
font_name = font_name.strip('"')
|
61
|
+
|
62
|
+
if font_name in self.fonts_list:
|
63
|
+
self.font = font_name
|
64
|
+
return f"Font changed to {font_name}."
|
65
|
+
else:
|
66
|
+
return f"Font {font_name} is not available. Available fonts are: {', '.join(self.fonts_list)}"
|
67
|
+
|
68
|
+
def set_api_key(self, api_key):
|
69
|
+
"""Sets a new API key and reconfigures the AI."""
|
70
|
+
self.api_key = api_key
|
71
|
+
self.configure_ai() # Ensure the new API key is used
|
72
|
+
return "API key updated successfully."
|
73
|
+
|
74
|
+
def switch_bot(self, bot_type):
|
75
|
+
"""Switch between bots."""
|
76
|
+
if bot_type in ["gemini", "meta", "chatgpt"]:
|
77
|
+
self.ai_type = bot_type
|
78
|
+
self.configure_ai()
|
79
|
+
return f"Switched to {bot_type} bot."
|
80
|
+
else:
|
81
|
+
return "Invalid bot type. Choose from 'gemini', 'meta', or 'chatgpt'."
|
82
|
+
|
83
|
+
def show_font_help(self):
|
84
|
+
"""Returns help text for the font command."""
|
85
|
+
return (
|
86
|
+
"/font set <font_name> - Change the font to the specified font name (e.g., 'Arial').\n"
|
87
|
+
"/font list - List all available fonts installed on your system.\n"
|
88
|
+
"Note: Fonts are case-sensitive and must match the exact name."
|
89
|
+
)
|
90
|
+
|
91
|
+
def show_help(self):
|
92
|
+
"""Returns general help text."""
|
93
|
+
return (
|
94
|
+
"/mute - Mute or unmute the bot.\n"
|
95
|
+
"/say <message> - Send a custom message without bot processing.\n"
|
96
|
+
"/font <set/list> - Change or list the fonts.\n"
|
97
|
+
"/apikey <API_KEY> - Set or view the current API key.\n"
|
98
|
+
"/switch <bot_name> - Switch between 'gemini', 'meta', or 'chatgpt' bots.\n"
|
99
|
+
"/help - Show this help message."
|
100
|
+
)
|
101
|
+
|
102
|
+
|
103
|
+
class ChatbotApp:
|
104
|
+
def __init__(self, root=None):
|
105
|
+
self.root = root or tk.Tk() # If root is provided, use it; otherwise create a new Tk instance.
|
106
|
+
self.root.title("Chatbot Interface")
|
107
|
+
|
108
|
+
# Create the chat area and set it to be non-editable
|
109
|
+
self.chat_area = tk.Text(self.root, state=tk.DISABLED, wrap=tk.WORD, height=20, width=50)
|
110
|
+
self.chat_area.pack(padx=10, pady=10, expand=True, fill=tk.BOTH)
|
111
|
+
|
112
|
+
# Input field for user to type messages
|
113
|
+
self.entry = tk.Entry(self.root, font=("Arial", 14))
|
114
|
+
self.entry.pack(fill=tk.X, padx=10, pady=10)
|
115
|
+
self.entry.bind("<Return>", self.send_message)
|
116
|
+
|
117
|
+
self.chatbot = SoftwareInterpreter()
|
118
|
+
|
119
|
+
def display_message(self, message, side="left"):
|
120
|
+
"""Displays the message in the chat area."""
|
121
|
+
self.chat_area.config(state=tk.NORMAL)
|
122
|
+
if side == "left":
|
123
|
+
self.chat_area.insert(tk.END, f"Bot: {message}\n")
|
124
|
+
else:
|
125
|
+
self.chat_area.insert(tk.END, f"You: {message}\n")
|
126
|
+
self.chat_area.config(state=tk.DISABLED)
|
127
|
+
self.chat_area.yview(tk.END)
|
128
|
+
|
129
|
+
def send_message(self, event):
|
130
|
+
"""Handles sending the user's message and receiving the bot's response."""
|
131
|
+
user_message = self.entry.get().strip()
|
132
|
+
|
133
|
+
if user_message: # Only send non-empty messages
|
134
|
+
self.display_message(user_message, side="right") # Show user's message
|
135
|
+
|
136
|
+
# Check for special commands
|
137
|
+
if user_message.startswith("/mute"):
|
138
|
+
bot_response = self.chatbot.toggle_mute()
|
139
|
+
elif user_message.startswith("/say"):
|
140
|
+
bot_response = user_message[5:].strip() if len(user_message) > 5 else "Usage: /say <message>"
|
141
|
+
elif user_message.startswith("/font set"):
|
142
|
+
font_name = user_message[9:].strip()
|
143
|
+
bot_response = self.chatbot.change_font(font_name)
|
144
|
+
# Update the font in the input field and chat area after the font change
|
145
|
+
self.entry.config(font=(self.chatbot.font, 14))
|
146
|
+
self.chat_area.config(font=(self.chatbot.font, 14))
|
147
|
+
elif user_message.startswith("/font list"):
|
148
|
+
bot_response = "\n".join(self.chatbot.fonts_list)
|
149
|
+
elif user_message.startswith("/font"):
|
150
|
+
bot_response = self.chatbot.show_font_help()
|
151
|
+
elif user_message.startswith("/apikey"):
|
152
|
+
new_api_key = user_message[8:].strip()
|
153
|
+
if new_api_key:
|
154
|
+
bot_response = self.chatbot.set_api_key(new_api_key)
|
155
|
+
else:
|
156
|
+
bot_response = f"Current API key: {self.chatbot.api_key if self.chatbot.api_key else 'Not set'}"
|
157
|
+
elif user_message.startswith("/switch"):
|
158
|
+
bot_type = user_message[8:].strip()
|
159
|
+
bot_response = self.chatbot.switch_bot(bot_type)
|
160
|
+
elif user_message.startswith("/help"):
|
161
|
+
bot_response = self.chatbot.show_help()
|
162
|
+
else:
|
163
|
+
bot_response = self.chatbot.get_response(user_message) # Get bot response
|
164
|
+
|
165
|
+
self.display_message(bot_response, side="left") # Show bot's response
|
166
|
+
|
167
|
+
self.entry.delete(0, tk.END) # Clear the input field after sending the message
|
168
|
+
|
169
|
+
def run(self):
|
170
|
+
"""Starts the tkinter GUI main loop."""
|
171
|
+
self.root.mainloop()
|
172
|
+
|
173
|
+
|
174
|
+
if __name__ == "__main__":
|
175
|
+
app = ChatbotApp()
|
176
|
+
app.run()
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
[build-system]
|
2
|
+
requires = ["setuptools>=42", "wheel"]
|
3
|
+
build-backend = "setuptools.build_meta"
|
4
|
+
|
5
|
+
[project]
|
6
|
+
name = "chatbotai-gui"
|
7
|
+
version = "1.0.1b1"
|
8
|
+
description = "A chatbot GUI that uses OpenAI, MetaAI, and Google Generative AI."
|
9
|
+
license = { text = "AGPL-3.0-or-later" } # ⬅️ Set the license **statically**
|
10
|
+
authors = [
|
11
|
+
{ name = "ProgMEM-CC" }
|
12
|
+
]
|
13
|
+
|
14
|
+
[tool.setuptools.packages]
|
15
|
+
find = {} # ⬅️ Automatically find packages
|
@@ -0,0 +1,32 @@
|
|
1
|
+
from setuptools import setup
|
2
|
+
|
3
|
+
setup(
|
4
|
+
name='chatbotai-gui',
|
5
|
+
version='1.0.1b1',
|
6
|
+
packages=['chatai'],
|
7
|
+
license='AGPL-3.0-or-later',
|
8
|
+
description='A chatbot GUI that uses OpenAI, MetaAI, and Google Generative AI.',
|
9
|
+
# Metadata
|
10
|
+
author='ProgMEM-CC',
|
11
|
+
|
12
|
+
# Required dependencies
|
13
|
+
install_requires=[
|
14
|
+
'openai',
|
15
|
+
'google.generativeai',
|
16
|
+
'meta_ai_api'
|
17
|
+
],
|
18
|
+
|
19
|
+
# Optional dependencies
|
20
|
+
extras_require={
|
21
|
+
'dev': [
|
22
|
+
'pytest',
|
23
|
+
'pytest-cov',
|
24
|
+
'coverage',
|
25
|
+
'flake8',
|
26
|
+
'black',
|
27
|
+
'isort'
|
28
|
+
]
|
29
|
+
},
|
30
|
+
include_package_data=True, # Ensures extra files like LICENSE are included
|
31
|
+
license_files=[]
|
32
|
+
)
|