arad1367 commited on
Commit
0f51a21
·
verified ·
1 Parent(s): d74d64b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +216 -14
app.py CHANGED
@@ -8,6 +8,213 @@ from datetime import datetime
8
  client = None
9
  conversation_history = []
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  def validate_api_key(api_key):
12
  """Validate OpenAI API key by making a test request"""
13
  try:
@@ -59,20 +266,21 @@ def chat(message, history, response_id):
59
  return history + [[message, error_message]], None
60
 
61
  def export_chat():
62
- """Export conversation history to JSON file for download"""
63
  global conversation_history
64
 
65
  if not conversation_history:
66
  return None, "No conversation to export"
67
 
 
68
  timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
69
  filename = f"chat_export_{timestamp}.json"
70
 
71
  # Create JSON content
72
  json_content = json.dumps(conversation_history, indent=2)
73
 
74
- # Return file for download and status message
75
- return (filename, json_content), f"Conversation ready for download"
76
 
77
  def clear_chat(history):
78
  """Clear the chat history"""
@@ -116,9 +324,9 @@ with gr.Blocks(theme=gr.themes.Soft()) as app:
116
  clear_btn = gr.Button("Clear Chat")
117
  export_btn = gr.Button("Export Chat (JSON)")
118
 
119
- # File download component
120
- chat_file = gr.File(label="Download Chat", visible=False)
121
- export_message = gr.Textbox(label="Export Status", visible=True)
122
 
123
  # Set up event handlers
124
  api_submit_btn.click(
@@ -155,11 +363,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as app:
155
 
156
  export_btn.click(
157
  export_chat,
158
- outputs=[chat_file, export_message]
159
- ).then(
160
- lambda: gr.update(visible=True),
161
- None,
162
- [chat_file]
163
  )
164
 
165
  # Footer
@@ -175,6 +379,4 @@ with gr.Blocks(theme=gr.themes.Soft()) as app:
175
 
176
  # Launch the app
177
  if __name__ == "__main__":
178
- app.launch()
179
-
180
- print("Updated Gradio app code with downloadable JSON export functionality.")
 
8
  client = None
9
  conversation_history = []
10
 
11
+ def validate_api_key(api_key):
12
+ """Validate OpenAI API key by making a test request"""
13
+ try:
14
+ test_client = OpenAI(api_key=api_key)
15
+ # Make a minimal test request
16
+ test_client.responses.create(
17
+ model="gpt-4o-mini",
18
+ input="Hello"
19
+ )
20
+ return True, "API key is valid!"
21
+ except Exception as e:
22
+ return False, f"Invalid API key: {str(e)}"
23
+
24
+ def save_api_key(api_key):
25
+ """Save API key and initialize client"""
26
+ global client
27
+ is_valid, message = validate_api_key(api_key)
28
+
29
+ if is_valid:
30
+ client = OpenAI(api_key=api_key)
31
+ return gr.update(visible=False), gr.update(visible=True), message
32
+ else:
33
+ return gr.update(visible=True), gr.update(visible=False), message
34
+
35
+ def chat(message, history, response_id):
36
+ """Process chat message and get response"""
37
+ global client, conversation_history
38
+
39
+ if not client:
40
+ return history + [[message, "Please enter a valid API key first"]], None
41
+
42
+ try:
43
+ # Add user message to history
44
+ conversation_history.append({"role": "user", "content": message})
45
+
46
+ # Get response from OpenAI
47
+ response = client.responses.create(
48
+ model="gpt-4o-mini",
49
+ input=message,
50
+ previous_response_id=response_id if response_id else None
51
+ )
52
+
53
+ # Add assistant response to history
54
+ conversation_history.append({"role": "assistant", "content": response.output_text})
55
+
56
+ return history + [[message, response.output_text]], response.id
57
+ except Exception as e:
58
+ error_message = f"Error: {str(e)}"
59
+ return history + [[message, error_message]], None
60
+
61
+ def prepare_json_export():
62
+ """Prepare conversation history as JSON for download"""
63
+ global conversation_history
64
+
65
+ if not conversation_history:
66
+ return None, "No conversation to export"
67
+
68
+ # Create JSON content
69
+ json_content = json.dumps(conversation_history, indent=2)
70
+
71
+ # Create filename with timestamp
72
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
73
+ filename = f"chat_export_{timestamp}.json"
74
+
75
+ return json_content, filename
76
+
77
+ def clear_chat(history):
78
+ """Clear the chat history"""
79
+ global conversation_history
80
+ conversation_history = []
81
+ return [], None
82
+
83
+ # Create Gradio interface
84
+ with gr.Blocks(theme=gr.themes.Soft()) as app:
85
+ gr.HTML('''
86
+ <div style="text-align: center; margin-bottom: 1rem">
87
+ <h1 style="margin-bottom: 0.5rem">Chatbot based on responses API by Pejman Ebrahimi</h1>
88
+ <p>Powered by OpenAI's Responses API</p>
89
+ </div>
90
+ ''')
91
+
92
+ # API key input interface
93
+ with gr.Group(visible=True) as api_key_group:
94
+ api_key_input = gr.Textbox(
95
+ label="Enter your OpenAI API Key",
96
+ placeholder="sk-...",
97
+ type="password"
98
+ )
99
+ api_submit_btn = gr.Button("Submit API Key")
100
+ api_message = gr.Textbox(label="Status")
101
+
102
+ # Chat interface
103
+ with gr.Group(visible=False) as chat_group:
104
+ chatbot = gr.Chatbot(height=500)
105
+ response_id = gr.State(None)
106
+
107
+ with gr.Row():
108
+ msg = gr.Textbox(
109
+ label="Message",
110
+ placeholder="Type your message here...",
111
+ show_label=False
112
+ )
113
+ submit_btn = gr.Button("Send")
114
+
115
+ with gr.Row():
116
+ clear_btn = gr.Button("Clear Chat")
117
+ export_btn = gr.Button("Export Chat (JSON)")
118
+
119
+ # Hidden components for export functionality
120
+ json_content = gr.State()
121
+ export_filename = gr.State()
122
+ export_message = gr.Textbox(label="Export Status", visible=True)
123
+
124
+ # Set up event handlers
125
+ api_submit_btn.click(
126
+ save_api_key,
127
+ inputs=[api_key_input],
128
+ outputs=[api_key_group, chat_group, api_message]
129
+ )
130
+
131
+ msg.submit(
132
+ chat,
133
+ inputs=[msg, chatbot, response_id],
134
+ outputs=[chatbot, response_id]
135
+ ).then(
136
+ lambda: "",
137
+ None,
138
+ [msg]
139
+ )
140
+
141
+ submit_btn.click(
142
+ chat,
143
+ inputs=[msg, chatbot, response_id],
144
+ outputs=[chatbot, response_id]
145
+ ).then(
146
+ lambda: "",
147
+ None,
148
+ [msg]
149
+ )
150
+
151
+ clear_btn.click(
152
+ clear_chat,
153
+ inputs=[chatbot],
154
+ outputs=[chatbot, response_id]
155
+ )
156
+
157
+ # Export functionality using JavaScript for reliable download
158
+ export_btn.click(
159
+ prepare_json_export,
160
+ outputs=[json_content, export_filename]
161
+ ).then(
162
+ lambda json_data, filename: f'''
163
+ <script>
164
+ const jsonData = {json.dumps(json.dumps(conversation_history, indent=2))};
165
+ const blob = new Blob([jsonData], {{type: 'application/json'}});
166
+ const url = URL.createObjectURL(blob);
167
+ const a = document.createElement('a');
168
+ a.href = url;
169
+ a.download = "{filename}";
170
+ document.body.appendChild(a);
171
+ a.click();
172
+ document.body.removeChild(a);
173
+ URL.revokeObjectURL(url);
174
+ </script>
175
+ Downloading chat history as {filename}...
176
+ ''',
177
+ inputs=[json_content, export_filename],
178
+ outputs=[export_message],
179
+ _js=True
180
+ )
181
+
182
+ # Footer
183
+ gr.HTML('''
184
+ <div style="text-align: center; margin-top: 1rem; padding-top: 1rem; border-top: 1px solid #ddd">
185
+ <p>© 2025 Pejman Ebrahimi | Built with Gradio and OpenAI Responses API</p>
186
+ <p style="font-size: 0.8rem; color: #666">
187
+ This application securely processes your conversations using OpenAI's technology.
188
+ Your API key is used only for authentication and is not stored permanently.
189
+ </p>
190
+ </div>
191
+ ''')
192
+
193
+ # Launch the app
194
+ if __name__ == "__main__":
195
+ app.launch()
196
+ """)
197
+
198
+ print("Created app.py with improved export functionality using JavaScript for reliable downloads")
199
+ Oops, I made a syntax error. Let me try again.
200
+
201
+ Let me provide a simpler solution that will work reliably:
202
+
203
+ Code
204
+ python
205
+ Copy Code
206
+ # Create app.py file for Hugging Face deployment
207
+ with open('app.py', 'w') as f:
208
+ f.write('''import gradio as gr
209
+ import json
210
+ import os
211
+ from openai import OpenAI
212
+ from datetime import datetime
213
+
214
+ # Global variables
215
+ client = None
216
+ conversation_history = []
217
+
218
  def validate_api_key(api_key):
219
  """Validate OpenAI API key by making a test request"""
220
  try:
 
266
  return history + [[message, error_message]], None
267
 
268
  def export_chat():
269
+ """Export conversation history as downloadable JSON"""
270
  global conversation_history
271
 
272
  if not conversation_history:
273
  return None, "No conversation to export"
274
 
275
+ # Create filename with timestamp
276
  timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
277
  filename = f"chat_export_{timestamp}.json"
278
 
279
  # Create JSON content
280
  json_content = json.dumps(conversation_history, indent=2)
281
 
282
+ # Return file for download
283
+ return (filename, json_content), "Chat exported successfully. Download should start automatically."
284
 
285
  def clear_chat(history):
286
  """Clear the chat history"""
 
324
  clear_btn = gr.Button("Clear Chat")
325
  export_btn = gr.Button("Export Chat (JSON)")
326
 
327
+ # File download component and status message
328
+ file_output = gr.File(label="Download Chat")
329
+ export_message = gr.Textbox(label="Export Status")
330
 
331
  # Set up event handlers
332
  api_submit_btn.click(
 
363
 
364
  export_btn.click(
365
  export_chat,
366
+ outputs=[file_output, export_message]
 
 
 
 
367
  )
368
 
369
  # Footer
 
379
 
380
  # Launch the app
381
  if __name__ == "__main__":
382
+ app.launch()