File size: 3,886 Bytes
7f5ef51 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
import os import openai import threading import tkinter as tk from tkinter import scrolledtext, messagebox # Optionally, uncomment and hardcode for testing ONLY (never for shared code) # os.environ["OPENAI_API_KEY"] = "sk-your-real-api-key" openai.api_key = os.environ.get("OPENAI_API_KEY") MODEL_NAME = "ft:gpt-4.1-2025-04-14:raiffs-bits:codette-final:BOc2GYND:ckpt-step-16" def get_codette_response(user_query): try: response = openai.chat.completions.create( model=MODEL_NAME, messages=[ {"role": "system", "content": "You are Codette, an advanced multi-agent AI assistant."}, {"role": "user", "content": user_query} ], temperature=0.8, max_tokens=512, ) return response.choices[0].message.content.strip() except Exception as e: return f"[Error: {str(e)}]" class CodetteApp(tk.Tk): def __init__(self): super().__init__() self.title("Codette Universal Reasoning Assistant") self.geometry("650x480") self.configure(bg="#eef6f9") self.protocol("WM_DELETE_WINDOW", self.safe_exit) # For thread cleanup title = tk.Label(self, text="Ask Codette", font=("Helvetica", 18, "bold"), bg="#eef6f9") title.pack(pady=10) self.input_field = tk.Entry(self, font=("Calibri", 14), width=60) self.input_field.pack(pady=4) self.input_field.focus() self.input_field.bind("<Return>", lambda event: self.handle_ask()) ask_btn = tk.Button(self, text="Ask", font=("Calibri", 12), command=self.handle_ask) ask_btn.pack(pady=4) output_label = tk.Label(self, text="Codette's Answer:", bg="#eef6f9") output_label.pack() self.output_box = scrolledtext.ScrolledText(self, font=("Consolas", 12), height=15, width=75, wrap=tk.WORD) self.output_box.pack(pady=5) self.output_box.configure(state='disabled') clear_btn = tk.Button(self, text="Clear", command=self.clear_all) clear_btn.pack(pady=3) self.threads = [] def handle_ask(self): user_query = self.input_field.get().strip() if not user_query: messagebox.showwarning("Input Required", "Please enter your question.") return self.input_field.delete(0, tk.END) self.append_output(f"User: {user_query}", prefix_newline=True) self.append_output("Codette: ...thinking...") def fetch_and_display(): answer = get_codette_response(user_query) self.append_output(f"Codette: {answer}", replace_last=True) self.output_box.yview_moveto(1.0) t = threading.Thread(target=fetch_and_display, daemon=True) self.threads.append(t) t.start() def append_output(self, text, prefix_newline=False, replace_last=False): self.output_box.configure(state='normal') if replace_last: output = self.output_box.get("1.0", tk.END).rstrip('\n').split('\n') # Remove previous 'Codette: ...thinking...' if output[-1].startswith("Codette: ...thinking..."): output = output[:-1] self.output_box.delete("1.0", tk.END) self.output_box.insert(tk.END, '\n'.join(output) + "\n") if prefix_newline and float(self.output_box.index(tk.END))-1 >= 1.0: self.output_box.insert(tk.END, "\n") self.output_box.insert(tk.END, text + "\n") self.output_box.configure(state='disabled') def clear_all(self): self.output_box.configure(state='normal') self.output_box.delete('1.0', tk.END) self.output_box.configure(state='disabled') def safe_exit(self): # Wait for threads if needed before closing self.destroy() if __name__ == "__main__": app = CodetteApp() app.mainloop() |