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()