import flet as ft
class Message():
def __init__(self, user_name: str, text: str, message_type: str):
self.user_name = user_name
self.text = text
self.message_type = message_type
class ChatMessage(ft.Row):
def __init__(self, message: Message):
super().__init__()
self.vertical_alignment = "start"
self.controls = [
ft.CircleAvatar(
content=ft.Text(self.get_initials(message.user_name)),
color=ft.colors.WHITE,
bgcolor=self.get_avatar_color(message.user_name),
),
ft.Column(
[
ft.Text(message.user_name, weight="bold"),
ft.Text(message.text, selectable=True),
],
tight=True,
spacing=5,
),
]
def get_initials(self, user_name: str):
return user_name[:1].capitalize()
def get_avatar_color(self, user_name: str):
colors_lookup = [
ft.colors.AMBER,
ft.colors.BLUE,
ft.colors.BROWN,
ft.colors.CYAN,
ft.colors.GREEN,
ft.colors.INDIGO,
ft.colors.LIME,
ft.colors.ORANGE,
ft.colors.PINK,
ft.colors.PURPLE,
ft.colors.RED,
ft.colors.TEAL,
ft.colors.YELLOW,
]
return colors_lookup[hash(user_name) % len(colors_lookup)]
def main(page: ft.Page):
page.horizontal_alignment = "stretch"
page.title = "ChatGPT - Flet"
def join_chat_click(e):
if not join_user_name.value:
join_user_name.error_text = "Name cannot be blank!"
join_user_name.update()
else:
page.session.set("user_name", join_user_name.value)
page.dialog.open = False
new_message.prefix = ft.Text(f"{join_user_name.value}: ")
page.pubsub.send_all(Message(user_name=join_user_name.value,
text=
f"{join_user_name.value}+has joined the chat.", message_type="login_message"))
page.update()
def send_message_click(e):
if new_message.value != "":
page.pubsub.send_all(Message(page.session.get(
"user_name"), new_message.value, message_type="chat_message"))
temp = new_message.value
new_message.value = ""
new_message.focus()
res = chatgpt(temp)
if len(res) > 220: # adjust the maximum length as needed
res = '\n'.join([res[i:i+220]
for i in range(0, len(res), 220)])
page.pubsub.send_all(
Message("ChatGPT", res, message_type="chat_message"))
page.update()
def chatgpt(message):
import openai
# Set up the OpenAI API client
openai.api_key = "YOUR API"
# Set up the model and prompt
model_engine = "text-davinci-003"
prompt = message
# Generate a response
completion = openai.Completion.create(
engine=model_engine,
prompt=prompt,
max_tokens=1024,
n=1,
stop=None,
temperature=0.5,
)
response = completion.choices[0].text.strip()
if response.startswith('\n'):
response = response[1:]
return response
def on_message(message: Message):
if message.message_type == "chat_message":
m = ChatMessage(message)
elif message.message_type == "login_message":
m = ft.Text(message.text, italic=True,
color=ft.colors.BLACK45, size=12)
chat.controls.append(m)
page.update()
page.pubsub.subscribe(on_message)
# A dialog asking for a user display name
join_user_name = ft.TextField(
label="Enter your name to join the chat",
autofocus=True,
on_submit=join_chat_click,
)
page.dialog = ft.AlertDialog(
open=True,
modal=True,
title=ft.Text("Welcome!"),
content=ft.Column([join_user_name], width=300, height=70, tight=True),
actions=[ft.ElevatedButton(
text="Join chat", on_click=join_chat_click)],
actions_alignment="end",
)
# Chat messages
chat = ft.ListView(
expand=True,
spacing=10,
auto_scroll=True,
)
# A new message entry form
new_message = ft.TextField(
hint_text="Write a message...",
autofocus=True,
shift_enter=True,
min_lines=1,
max_lines=5,
filled=True,
expand=True,
on_submit=send_message_click,
)
# Add everything to the page
page.add(
ft.Container(
content=chat,
border=ft.border.all(1, ft.colors.OUTLINE),
border_radius=5,
padding=10,
expand=True,
),
ft.Row(
[
new_message,
ft.IconButton(
icon=ft.icons.SEND_ROUNDED,
tooltip="Send message",
on_click=send_message_click,
),
]
),
)
# to run the flet application as a web application on the browser
ft.app(target=main, port=9000, view=ft.WEB_BROWSER)
# to run the flet application as a desktop application
ft.app(target=main)