restore-images commited on
Commit
d557184
1 Parent(s): db491ec

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +250 -0
app.py ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from requests.exceptions import ConnectTimeout
3
+ import time
4
+ import requests
5
+ import base64
6
+
7
+ global headers
8
+ global cancel_url
9
+ global path
10
+ global output_image
11
+ global property_name_array
12
+ property_name_array =[]
13
+ output_image = ''
14
+ path = ''
15
+ cancel_url =''
16
+ headers = {
17
+ 'Content-Type': 'application/json',
18
+ 'Authorization': 'Token r8_ZGZlzThfRkPZVDMygVclY1XZ9AuxmIQ2qwwPP',
19
+ "Access-Control-Allow-Headers": "Content-Type",
20
+ "Access-Control-Allow-Origin": '**',
21
+ "Access-Control-Allow-Methods": "OPTIONS,POST,GET,PATCH"}
22
+
23
+ with gr.Blocks() as demo:
24
+ owner = "cjwbw"
25
+ name = "supir"
26
+ max_retries = 3
27
+ retry_delay = 2
28
+ for retry in range(max_retries):
29
+ try:
30
+ url = f'https://api.replicate.com/v1/models/{owner}/{name}'
31
+ response = requests.get(url, headers=headers, timeout=10)
32
+ # Process the response
33
+ break # Break out of the loop if the request is successful
34
+ except ConnectTimeout:
35
+ if retry < max_retries - 1:
36
+ print(f"Connection timed out. Retrying in {retry_delay} seconds...")
37
+ time.sleep(retry_delay)
38
+ else:
39
+ print("Max retries exceeded. Unable to establish connection.")
40
+
41
+ data = response.json()
42
+ description =data.get("description", '')
43
+ title = data.get("default_example",'').get("model",'')
44
+ version = data.get("default_example",'').get("version",'')
45
+
46
+ gr.Markdown(
47
+ f"""
48
+ # {title}
49
+ {description}
50
+ """)
51
+
52
+ with gr.Row():
53
+ with gr.Column():
54
+ inputs =[]
55
+ schema = data.get("latest_version", {}).get("openapi_schema", {}).get("components", {}).get("schemas", {})
56
+ ordered_properties = sorted(schema.get("Input", {}).get("properties", {}).items(), key=lambda x: x[1].get("x-order", 0))
57
+ required = schema.get("Input", '').get('required', [])
58
+ print(required,"required")
59
+ for property_name, property_info in ordered_properties :
60
+ property_name_array.append(property_name)
61
+ if required:
62
+ for item in required:
63
+ if item == property_name:
64
+ label = "*"+ property_info.get('title', '')
65
+ description = property_info.get('description','')
66
+ break
67
+ else:
68
+ label = property_info.get('title', '')
69
+ description = property_info.get('description','')
70
+ else:
71
+ label = property_info.get('title', '')
72
+ description = property_info.get('description','')
73
+
74
+ if "x-order" in property_info:
75
+ order = int(property_info.get('x-order',''))
76
+ if property_info.get("type", {}) == "integer":
77
+ value= data.get('default_example', '').get('input','').get(property_name,0)
78
+ if "minimum" and "maximum" in property_info:
79
+ if value == 0:
80
+ inputs.insert(order, gr.Slider(label=label, info= description, value=property_info.get('default', value), minimum=property_info.get('minimum', ''), maximum=property_info.get('maximum', ''), step=1))
81
+ else:
82
+ inputs.insert(order, gr.Slider(label=label, info= description, value=value, minimum=property_info.get('minimum', ''), maximum=property_info.get('maximum', ''), step=1))
83
+ else:
84
+ if value == 0:
85
+ inputs.insert(order, gr.Number(label=label, info= description, value=property_info.get('default', value)))
86
+ else:
87
+ inputs.insert(order, gr.Number(label=label, info= description, value=value))
88
+
89
+ elif property_info.get("type", {}) == "string":
90
+ value= data.get('default_example', '').get('input','').get(property_name,'')
91
+ if property_info.get('format','') == 'uri':
92
+
93
+ if value :
94
+ inputs.insert(order, gr.Image(label=label, value=value, type="filepath"))
95
+ else :
96
+ inputs.insert(order, gr.Image(label=label, type="filepath"))
97
+
98
+ else:
99
+ if value == '':
100
+ inputs.insert(order, gr.Textbox(label=label,info= description, value=property_info.get('default', value)))
101
+ else:
102
+ inputs.insert(order, gr.Textbox(label=label,info= description, value=value))
103
+
104
+ elif property_info.get("type", {}) == "number":
105
+ value= data.get('default_example', '').get('input','').get(property_name, 0)
106
+ if "minimum" and "maximum" in property_info:
107
+ if value == 0:
108
+ inputs.insert(order, gr.Slider(label=label,info= description, value=property_info.get('default', value), minimum=property_info.get('minimum', ''), maximum=property_info.get('maximum', '')))
109
+ else:
110
+ inputs.insert(order, gr.Slider(label=label,info= description, value=value, minimum=property_info.get('minimum', ''), maximum=property_info.get('maximum', '')))
111
+ else:
112
+ if value == 0:
113
+ inputs.insert(order, gr.Number(label=label,info= description, value=property_info.get('default', value)))
114
+ else:
115
+ inputs.insert(order, gr.Number(label=label,info= description, value=value))
116
+ elif property_info.get("type", {}) == "boolean":
117
+ value= data.get('default_example', '').get('input','').get(property_name,'')
118
+ if value == '':
119
+ inputs.insert(order, gr.Checkbox(label=label,info= description, value=property_info.get('default', value)))
120
+ else:
121
+ inputs.insert(order, gr.Checkbox(label=label,info= description, value=value))
122
+ else:
123
+ value= data.get('default_example', '').get('input','').get(property_name,'')
124
+ options=schema.get(property_name,'').get('enum',[])
125
+ if value:
126
+ inputs.insert(order, gr.Dropdown(label=property_name,info= description,choices=options, value=property_info.get("default", value)))
127
+ else:
128
+ inputs.insert(order, gr.Dropdown(label=property_name,info= description,choices=options, value=value))
129
+
130
+ with gr.Row():
131
+ cancel_btn = gr.Button("Cancel")
132
+ run_btn = gr.Button("Run")
133
+
134
+ with gr.Column():
135
+
136
+ outputs = []
137
+
138
+ output_result = data.get("default_example", '').get("output")
139
+ output_type= schema.get("Output", '').get("type", '')
140
+ if output_type == 'array':
141
+ output_image = output_result[0].get("file", '')
142
+ else:
143
+ output_image = output_result
144
+ print (output_image)
145
+ outputs.append(gr.Image(value=output_image))
146
+ outputs.append(gr.Image(visible=False))
147
+ outputs.append(gr.Image(visible=False))
148
+ outputs.append(gr.Image(visible=False))
149
+
150
+
151
+
152
+ def run_process(input1, input2, input3, input4, input5, input6, input7, input8, input9,input10,input11, input12, input13, input14, input15, input16, input17, input18, input19 ):
153
+ global cancel_url
154
+ global property_name_array
155
+ print(len(property_name_array))
156
+ cancel_url=''
157
+ url = 'https://replicate.com/api/predictions'
158
+
159
+ if input2:
160
+ with open(input2, "rb") as file:
161
+ data = file.read()
162
+
163
+ base64_data = base64.b64encode(data).decode("utf-8")
164
+ mimetype = "image/jpg"
165
+ data_uri_image = f"data:{mimetype};base64,{base64_data}"
166
+ else:
167
+ data_uri_image=None
168
+
169
+ print(version, 'version')
170
+ body = {
171
+ "version": version,
172
+ "input": {
173
+ property_name_array[0]: input1,
174
+ property_name_array[1]: data_uri_image,
175
+ property_name_array[2]: input3,
176
+ property_name_array[3]: input4,
177
+ property_name_array[4]: input5,
178
+ property_name_array[5]: input6,
179
+ property_name_array[6]: input7,
180
+ property_name_array[7]: input8,
181
+ property_name_array[8]: input9,
182
+ property_name_array[9]: input10,
183
+ property_name_array[10]: input11,
184
+ property_name_array[11]: input12,
185
+ property_name_array[12]: input13,
186
+ property_name_array[13]: input14,
187
+ property_name_array[14]: input15,
188
+ property_name_array[15]: input16,
189
+ property_name_array[16]: input17,
190
+ property_name_array[17]: input18,
191
+ property_name_array[18]: input19,
192
+
193
+ }
194
+ }
195
+
196
+
197
+ response = requests.post(url, json=body)
198
+ print(response.status_code)
199
+ if response.status_code == 201:
200
+ response_data = response.json()
201
+ get_url = response_data.get('urls','').get('get','')
202
+ identifier = 'https://replicate.com/api/predictions/'+get_url.split("/")[-1]
203
+
204
+ print(identifier,'')
205
+ time.sleep(3)
206
+ output =verify_image(identifier)
207
+ print(output,'333')
208
+ if output:
209
+ return gr.Image(value=output), gr.Image(),gr.Image(),gr.Image()
210
+
211
+ return gr.Image(),gr.Image(visible=False),gr.Image(visible=False),gr.Image(visible=False)
212
+
213
+ def cancel_process(input1, input2, input3, input4, input5, input6, input7, input8, input9,input10,input11, input12, input13, input14, input15, input16, input17, input18, input19 ):
214
+ global cancel_url
215
+ cancel_url = '123'
216
+ global output_image
217
+ return gr.Image(value=output_image), gr.Image(visible=False),gr.Image(visible=False),gr.Image(visible=False)
218
+
219
+ def verify_image(get_url):
220
+ res = requests.get(get_url)
221
+ if res.status_code == 200:
222
+ res_data = res.json()
223
+ if res_data.get('error',''):
224
+ return
225
+ else:
226
+ if cancel_url:
227
+ return
228
+ else:
229
+ output = res_data.get('output', [])
230
+ print(output,'111')
231
+ if output:
232
+ print(output,'222')
233
+ return output
234
+
235
+ else:
236
+ time.sleep(1)
237
+ val = verify_image(get_url)
238
+ return val
239
+ else:
240
+ return []
241
+
242
+ run_btn.click(run_process, inputs=inputs, outputs=outputs, api_name="run")
243
+ cancel_btn.click(cancel_process, inputs=inputs, outputs=outputs, api_name="cancel")
244
+
245
+ demo.launch()
246
+
247
+
248
+
249
+
250
+