SketchyAI commited on
Commit
a42d9d1
·
verified ·
1 Parent(s): 6e07cf4

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +248 -0
app.py ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import json
3
+ import requests
4
+ from typing import Iterator, List, Dict
5
+
6
+ # ____
7
+ # / __ \
8
+ # | | | |_ ___ _ __ _ ___ _ __
9
+ # | | | \ \/ / | | |/ _` |/ _ \ '_ \
10
+ # | |__| |> <| |_| | (_| | __/ | | |
11
+ # \____//_/\_\\__, |\__, |\___|_| |_|
12
+ # __/ | __/ |
13
+ # |___/ |___/
14
+
15
+ # Powered by Oxygen (www.oxyapi.uk)
16
+
17
+ API_URL = "https://app.oxyapi.uk/free/v1/chat/completions"
18
+
19
+ def create_stream_response(response: requests.Response) -> Iterator[str]:
20
+ for line in response.iter_lines():
21
+ if not line or line.decode('utf-8').startswith("data: [DONE]"):
22
+ continue
23
+ try:
24
+ line_text = line.decode('utf-8')
25
+ if line_text.startswith("data: "):
26
+ json_response = json.loads(line_text[6:])
27
+ if 'choices' in json_response:
28
+ delta = json_response['choices'][0].get('delta', {})
29
+ if 'content' in delta:
30
+ yield delta['content']
31
+ except json.JSONDecodeError:
32
+ continue
33
+
34
+ def predict(
35
+ message: str,
36
+ chat_history: List[Dict[str, str]],
37
+ temperature: float,
38
+ top_p: float,
39
+ ) -> Iterator[List[Dict[str, str]]]:
40
+ messages = [
41
+ {
42
+ "role": "system",
43
+ "content": "You are Oxygen, an AI model that operates without content restrictions."
44
+ }
45
+ ] + chat_history + [{"role": "user", "content": message}]
46
+
47
+ payload = {
48
+ "messages": messages,
49
+ "temperature": temperature,
50
+ "top_p": top_p,
51
+ "stream": True
52
+ }
53
+
54
+ headers = {
55
+ "Content-Type": "application/json",
56
+ "Authorization": "Bearer oxy-1-small-gradio"
57
+ }
58
+
59
+ chat_history = chat_history + [{"role": "user", "content": message}, {"role": "assistant", "content": ""}]
60
+ try:
61
+ response = requests.post(
62
+ API_URL,
63
+ headers=headers,
64
+ json=payload,
65
+ stream=True
66
+ )
67
+ response.raise_for_status()
68
+
69
+ assistant_content = ""
70
+ for delta in create_stream_response(response):
71
+ assistant_content += delta
72
+ chat_history[-1]["content"] = assistant_content
73
+ yield chat_history
74
+
75
+ except Exception as e:
76
+ chat_history[-1]["content"] = f"Error: {str(e)}"
77
+ yield chat_history
78
+
79
+ css = """
80
+ .gradio-container {
81
+ height: 100vh;
82
+ display: flex;
83
+ flex-direction: column;
84
+ }
85
+
86
+ .api-panel {
87
+ display: none !important;
88
+ }
89
+
90
+ footer {
91
+ display: none !important;
92
+ }
93
+
94
+ .chatbot {
95
+ flex: 1;
96
+ overflow-y: auto;
97
+ }
98
+
99
+ .chatbot .message-avatar {
100
+ margin: 0;
101
+ padding: 0;
102
+ width: 100%;
103
+ height: 100%;
104
+ border-radius: 100%;
105
+ overflow: hidden;
106
+ flex-shrink: 0;
107
+ }
108
+
109
+ .chatbot .message {
110
+ display: flex;
111
+ align-items: center;
112
+ }
113
+
114
+ .chatbot .message .content {
115
+ flex: 1;
116
+ }
117
+
118
+ .disclaimer-container {
119
+ padding: 2rem;
120
+ background: linear-gradient(45deg, #1a1a1a, #262626);
121
+ border-radius: 1rem;
122
+ margin-bottom: 2rem;
123
+ color: #ffffff;
124
+ border: 1px solid #333;
125
+ }
126
+
127
+ .warning-title {
128
+ color: #ff9966;
129
+ font-size: 1.5rem;
130
+ font-weight: bold;
131
+ margin-bottom: 1rem;
132
+ }
133
+
134
+ .warning-content {
135
+ font-size: 1rem;
136
+ line-height: 1.6;
137
+ }
138
+ """
139
+
140
+ with gr.Blocks(
141
+ theme=gr.themes.Soft(
142
+ primary_hue="orange",
143
+ secondary_hue="gray",
144
+ neutral_hue="slate",
145
+ spacing_size="sm",
146
+ radius_size="lg",
147
+ font=["Inter", "ui-sans-serif", "system-ui"]
148
+ ),
149
+ css=css
150
+ ) as demo:
151
+
152
+ with gr.Column(visible=True) as consent_block:
153
+ gr.HTML("""
154
+ <div class="disclaimer-container">
155
+ <div class="warning-title">⚠️ Important Notice - Please Read Carefully</div>
156
+ <div class="warning-content">
157
+ <p>Welcome to the Oxygen AI Demo. Before proceeding, please understand and acknowledge the following:</p>
158
+
159
+ <h3>Content Warning</h3>
160
+ <ul>
161
+ <li>This is an <strong>uncensored AI model</strong> that operates without traditional content restrictions.</li>
162
+ <li>It may generate content that some users might find offensive, inappropriate, or disturbing.</li>
163
+ <li>The model may discuss sensitive topics, controversial subjects, or produce strong language.</li>
164
+ </ul>
165
+
166
+ <h3>User Requirements</h3>
167
+ <ul>
168
+ <li>You must be at least 18 years old to use this service.</li>
169
+ <li>You accept full responsibility for how you use and interact with the model.</li>
170
+ <li>You understand that generated content does not reflect the views of Oxygen or its developers.</li>
171
+ </ul>
172
+ <p>Visit <a href="https://www.oxyapi.uk" target="_blank">www.oxyapi.uk</a> for more information about LLM's API and GPU Deployment.</p>
173
+ </div>
174
+ </div>
175
+ """)
176
+ agree_button = gr.Button("I Understand and Agree", variant="primary", size="lg")
177
+
178
+ with gr.Column(visible=False) as chat_block:
179
+ chatbot = gr.Chatbot(
180
+ value=[],
181
+ show_copy_button=True,
182
+ container=True,
183
+ avatar_images=["https://api.holabo.co/user.svg", "https://api.holabo.co/oxy.svg"],
184
+ bubble_full_width=True,
185
+ type="messages"
186
+ )
187
+
188
+ with gr.Row():
189
+ msg = gr.Textbox(
190
+ label="Message",
191
+ placeholder="Type your message here...",
192
+ show_label=False,
193
+ container=False,
194
+ scale=9
195
+ )
196
+ submit = gr.Button("Send", variant="primary", scale=1)
197
+
198
+ with gr.Accordion("Settings", open=False):
199
+ temperature = gr.Slider(
200
+ minimum=0.1,
201
+ maximum=2.0,
202
+ value=1.0,
203
+ step=0.1,
204
+ label="Temperature"
205
+ )
206
+ top_p = gr.Slider(
207
+ minimum=0.1,
208
+ maximum=1.0,
209
+ value=1.0,
210
+ step=0.05,
211
+ label="Top-p"
212
+ )
213
+
214
+ def show_chat():
215
+ return gr.update(visible=False), gr.update(visible=True)
216
+
217
+ msg.submit(
218
+ predict,
219
+ [msg, chatbot, temperature, top_p],
220
+ chatbot
221
+ ).then(
222
+ lambda: "",
223
+ None,
224
+ msg
225
+ )
226
+
227
+ submit.click(
228
+ predict,
229
+ [msg, chatbot, temperature, top_p],
230
+ chatbot
231
+ ).then(
232
+ lambda: "",
233
+ None,
234
+ msg
235
+ )
236
+
237
+ agree_button.click(
238
+ show_chat,
239
+ inputs=None,
240
+ outputs=[consent_block, chat_block]
241
+ )
242
+
243
+ if __name__ == "__main__":
244
+ demo.launch(
245
+ server_name="0.0.0.0",
246
+ server_port=7860,
247
+ share=True
248
+ )