77
88from tkinter import ttk , font
99from threading import Thread
10- from typing import Union , Generator
11- from contextlib import contextmanager
12-
13-
14- @contextmanager
15- def widget_state_manager (self : "AIChatInterface" ):
16- try :
17- self .chat_box .config (state = tk .NORMAL )
18- self .send_button .state (["disabled" ])
19- yield
20- except Exception : # noqa
21- self .append_text_to_chat (tk .END , f"\n AI error!\n \n " , ("Error" ,))
22- finally :
23- self .chat_box .config (state = tk .DISABLED )
24- self .send_button .state (["!disabled" ])
2510
2611
2712class AIChatInterface :
@@ -50,10 +35,10 @@ def __init__(self, root):
5035 self .host_input .grid (row = 0 , column = 4 , padx = (5 , 10 ))
5136 self .host_input .insert (0 , self .api_url )
5237
53- clear_button = ttk .Button (
38+ self . clear_button = ttk .Button (
5439 header_frame , text = "Clear Chat" , command = self .clear_chat
5540 )
56- clear_button .grid (row = 0 , column = 5 )
41+ self . clear_button .grid (row = 0 , column = 5 )
5742
5843 # chat container
5944 chat_frame = ttk .Frame (root )
@@ -95,8 +80,10 @@ def __init__(self, root):
9580 self .refresh_models ()
9681
9782 def append_text_to_chat (self , text , * args ):
83+ self .chat_box .config (state = tk .NORMAL )
9884 self .chat_box .insert (tk .END , text , * args )
9985 self .chat_box .see (tk .END )
86+ self .chat_box .config (state = tk .DISABLED )
10087
10188 def handle_key_press (self , event ):
10289 if event .keysym == "Return" :
@@ -142,33 +129,39 @@ def show_error(self):
142129 def on_send_button (self , _ = None ):
143130 message = self .user_input .get ("1.0" , "end-1c" ).strip ()
144131 if message :
145- self .add_message_to_chat (message )
132+ self .append_text_to_chat (f"User: \n " , ("Bold" , "User" ))
133+ self .append_text_to_chat (f"{ message } \n \n " )
146134 self .user_input .delete ("1.0" , "end" )
135+ self .chat_history .append ({"role" : "user" , "content" : message })
147136
148137 Thread (
149- target = self .add_message_to_chat ,
150- args = (self .generate_ai_response (),),
138+ target = self .generate_ai_response ,
151139 daemon = True ,
152140 ).start ()
153141
154- def add_message_to_chat (self , message : Union [str , Generator ]):
155- with widget_state_manager (self ):
156- if isinstance (message , str ):
157- self .append_text_to_chat (f"User: \n " , ("Bold" , "User" ))
158- self .append_text_to_chat (f"{ message } " )
159- self .chat_history .append ({"role" : "user" , "content" : message })
160- else :
161- self .append_text_to_chat (
162- f"AI ({ self .model_select .get ()} ): \n " , ("Bold" , "AI" )
163- )
164- ai_message = ""
165- for i in message :
166- self .append_text_to_chat (f"{ i } " )
167- ai_message += i
168- self .chat_history .append ({"role" : "assistant" , "content" : ai_message })
142+ def generate_ai_response (self ):
143+ self .send_button .state (["disabled" ])
144+ self .refresh_button .state (["disabled" ])
145+ self .clear_button .state (["disabled" ])
146+
147+ try :
148+ self .append_text_to_chat (
149+ f"AI ({ self .model_select .get ()} ): \n " , ("Bold" , "AI" )
150+ )
151+ ai_message = ""
152+ for i in self ._request_ollama ():
153+ self .append_text_to_chat (f"{ i } " )
154+ ai_message += i
155+ self .chat_history .append ({"role" : "assistant" , "content" : ai_message })
169156 self .append_text_to_chat ("\n \n " )
157+ except Exception : # noqa
158+ self .append_text_to_chat (tk .END , f"\n AI error!\n \n " , ("Error" ,))
159+ finally :
160+ self .send_button .state (["!disabled" ])
161+ self .refresh_button .state (["!disabled" ])
162+ self .clear_button .state (["!disabled" ])
170163
171- def generate_ai_response (self ):
164+ def _request_ollama (self ):
172165 request = urllib .request .Request (
173166 f"{ self .api_url } /api/chat" ,
174167 data = json .dumps (
@@ -190,8 +183,9 @@ def generate_ai_response(self):
190183 yield data ["message" ]["content" ]
191184
192185 def clear_chat (self ):
193- with widget_state_manager (self ):
194- self .chat_box .delete (1.0 , tk .END )
186+ self .chat_box .config (state = tk .NORMAL )
187+ self .chat_box .delete (1.0 , tk .END )
188+ self .chat_box .config (state = tk .DISABLED )
195189 self .chat_history .clear ()
196190
197191
0 commit comments