Spaces:
Sleeping
Sleeping
| import http.server | |
| import socketserver | |
| import urllib.parse | |
| import json | |
| import base64 | |
| from curl_cffi import requests | |
| import sys | |
| class ImageHandler(http.server.SimpleHTTPRequestHandler): | |
| def do_GET(self): | |
| print(f"[{self.log_date_time_string()}] '{self.address_string()}': GET {self.path}") | |
| if self.path.startswith('/steps/'): | |
| parsed_path = urllib.parse.unquote(self.path) | |
| parts = parsed_path.split('/', 3) | |
| print(f" Parsed path: {parts}") | |
| if len(parts) >= 3: | |
| try: | |
| steps = int(parts[2]) | |
| prompt = '/'.join(parts[3:]) if len(parts) > 3 else "" | |
| print(f" Steps: {steps}, Prompt: '{prompt}'") | |
| if prompt: | |
| self.generate_and_serve_image(prompt, steps) | |
| return | |
| except (ValueError, IndexError) as e: | |
| print(f" Parse error: {e}") | |
| pass | |
| print(" 404 - Path doesn't match /steps/{steps}/pattern") | |
| self.send_response(404) | |
| self.end_headers() | |
| self.wfile.write(b'Not Found') | |
| def generate_and_serve_image(self, prompt: str, num_steps: int = 4): | |
| print(f" Generating image for prompt: '{prompt}' with {num_steps} steps") | |
| try: | |
| url = "https://multi-modal.ai.cloudflare.com/api/inference" | |
| headers = { | |
| 'accept': '*/*', | |
| 'accept-language': 'en-US,en;q=0.9', | |
| 'cache-control': 'no-cache', | |
| 'content-type': 'application/json', | |
| 'cookie': '_biz_uid=f039195dc4204df9da5d4e3b7066e368; _mkto_trk=id:713-XSC-918&token:_mch-cloudflare.com-70f2772b2e70dc0b5dcd8858a70f3817; _ga_8BK794H3J9=GS1.1.1745122895.1.1.1745122971.0.0.0; _biz_flagsA=%7B%22Version%22%3A1%2C%22XDomain%22%3A%221%22%2C%22ViewThrough%22%3A%221%22%2C%22Mkto%22%3A%221%22%2C%22Ecid%22%3A%22251012964%22%7D; cfz_facebook-pixel=%7B%22OwdI_fb-pixel%22%3A%7B%22v%22%3A%22fb.2.1744224978265.1003215434%22%2C%22e%22%3A1775760978265%7D%2C%22VVgx_fb-pixel%22%3A%7B%22v%22%3A%22fb.2.1744224978265.326138134%22%2C%22e%22%3A1775760978265%7D%2C%22bHox_fb-pixel%22%3A%7B%22v%22%3A%22fb.2.1744224978265.463779223%22%2C%22e%22%3A1775760978265%7D%2C%22elKW_fb-pixel%22%3A%7B%22v%22%3A%22fb.2.1744224978265.1208552939%22%2C%22e%22%3A1775760978265%7D%2C%22dzQR_fb-pixel%22%3A%7B%22v%22%3A%22fb.2.1746847816852.132900741%22%2C%22e%22%3A1778383816852%7D%7D; _ga_NPJQ92CQTK=GS2.1.s1747528838$o1$g0$t1747528847$j0$l0$h0; cfz_zaraz-analytics=%7B%22_cfa_clientId%22%3A%7B%22v%22%3A%2235625994394362004%22%2C%22e%22%3A1773974975733%7D%7D; zaraz-consent={"Tuku":true,"aMDT":true,"lryA":true,"YTmY":true}; OptanonConsent=isGpcEnabled=0&datestamp=Thu+Sep+04+2025+11%3A00%3A57+GMT-0700+(Pacific+Daylight+Time)&version=202310.2.0&browserGpcFlag=0&isIABGlobal=false&hosts=&consentId=399495dc-969b-45a8-b4f3-319d001982a5&interactionCount=1&isAnonUser=1&landingPath=NotLandingPage&groups=SSPD_BG%3A1%2CC0004%3A1%2CC0002%3A1%2CC0003%3A1%2CC0001%3A1&AwaitingReconsent=false; _ga=GA1.1.ed07327b-c999-4e25-89cc-11724cb95915; _uetvid=19aa8610dd0f11ef9459b70ed2100f99|1k749jc|1760835793501|1|1|bat.bing.com/p/insights/c/i; _ga_SQCRB0TXZW=GS2.1.s1760835791$o61$g1$t1760835804$j47$l0$h0$d5y8fuUQP0L-TmEsFfyn9G5nyQMYe0VYjOw; CF_VERIFIED_DEVICE_9d684455d07b4a57cd5411d6748b9acae6f426f4e40e45f836793f1f60701bf7=1761772679; AMCV_8AD56F28618A50850A495FB6%40AdobeOrg=179643557%7CMCMID%7C34403450697062221771928232009572502495%7CMCIDTS%7C20432%7CMCAAMLH-1765905548%7C9%7CMCAAMB-1765905548%7Cj8Odv6LonN4r3an7LhD3WZrU1bUpAkFkkiY1ncBR96t2PTI%7CMCOPTOUT-1765307948s%7CNONE%7CvVersion%7C5.5.0; cfz_adobe=%7B%22MsVJ_ecid%22%3A%7B%22v%22%3A%22CiYzNDQwMzQ1MDY5NzA2MjIyMTc3MTkyODIzMjAwOTU3MjUwMjQ5NVIQCJqTpN_hMhgBKgNWQTYwA_AB-YX_oLAz%22%2C%22e%22%3A1799613197869%7D%7D; CF_VERIFIED_DEVICE_254287c9bd0d28997963ced5a664b0e5ea496b5b2ce91992acb42647f38b21f1=1765487159; sparrow_id={"deviceId":"0a8a5454-47c7-4828-bb99-3b6089a9ce30"}; _biz_nA=175; _biz_pendingA=%5B%5D; cfz_amplitude=%7B%22TTin_event_id%22%3A%7B%22v%22%3A%22309%22%2C%22e%22%3A1797549980022%7D%2C%22TTin_device_id%22%3A%7B%22v%22%3A%22736590d3-2137-43dd-9ce6-e1f5729e6f7c%22%2C%22e%22%3A1775760979730%7D%2C%22FDpb_event_id%22%3A%7B%22v%22%3A%229%22%2C%22e%22%3A1777250687224%7D%2C%22FDpb_device_id%22%3A%7B%22v%22%3A%221aaeb293-3680-4db3-9474-2f16e4c09582%22%2C%22e%22%3A1777250649901%7D%7D; cfz_google-analytics_v4=%7B%22nzcr_engagementDuration%22%3A%7B%22v%22%3A%223536%22%2C%22e%22%3A1797549983527%7D%2C%22nzcr_engagementStart%22%3A%7B%22v%22%3A%221766013983527%22%2C%22e%22%3A1797549983527%7D%2C%22nzcr_counter%22%3A%7B%22v%22%3A%221311%22%2C%22e%22%3A1797549979991%7D%2C%22nzcr_session_counter%22%3A%7B%22v%22%3A%22105%22%2C%22e%22%3A1797549979991%7D%2C%22nzcr_ga4%22%3A%7B%22v%22%3A%22ed07327b-c999-4e25-89cc-11724cb95915%22%2C%22e%22%3A1797549979991%7D%2C%22nzcr__z_ga_audiences%22%3A%7B%22v%22%3A%22ed07327b-c999-4e25-89cc-11724cb95915%22%2C%22e%22%3A1773974977600%7D%2C%22nzcr_let%22%3A%7B%22v%22%3A%221766013979991%22%2C%22e%22%3A1797549979991%7D%7D; cfz_reddit=%7B%22fZaD_reddit_uuid%22%3A%7B%22v%22%3A%221767896575113.bb4b01c8-26ba-49db-b58c-c1e15e29f9c3%22%2C%22e%22%3A1799432575113%7D%7D; OptanonConsent=isGpcEnabled=0&datestamp=Thu+Jan+08+2026+10%3A22%3A55+GMT-0800+(Pacific+Standard+Time)&version=202503.1.0&browserGpcFlag=0&isIABGlobal=false&hosts=&consentId=3e1d8b67-a322-45f7-a3a2-50bcf94178f9&interactionCount=1&isAnonUser=1&landingPath=NotLandingPage&groups=SSPD_BG%3A1%2CC0004%3A1%2CC0002%3A1%2CC0003%3A1%2CC0001%3A1&AwaitingReconsent=false; kndctr_8AD56F28618A50850A495FB6_AdobeOrg_identity=CiYzNDQwMzQ1MDY5NzA2MjIyMTc3MTkyODIzMjAwOTU3MjUwMjQ5NVIQCJqTpN_hMhgBKgNWQTYwA_ABl9_j9rkz; __q_state_37pXYrro6wCZbsU7=eyJ1dWlkIjoiN2UxMjE4YWUtNDk4NC00YWVlLWFmZmEtMWQ4Y2ViNjc5ODY0IiwiY29va2llRG9tYWluIjoiY2xvdWRmbGFyZS5jb20iLCJtZXNzZW5nZXJFeHBhbmRlZCI6ZmFsc2UsInByb21wdERpc21pc3NlZCI6ZmFsc2UsImNvbnZlcnNhdGlvbklkIjoiMTgyMzgwNjA3OTQ2OTc5ODg1MSJ9', | |
| 'origin': 'https://multi-modal.ai.cloudflare.com', | |
| 'pragma': 'no-cache', | |
| 'priority': 'u=1, i', | |
| 'referer': 'https://multi-modal.ai.cloudflare.com/', | |
| 'sec-fetch-dest': 'empty', | |
| 'sec-fetch-mode': 'cors', | |
| 'sec-fetch-site': 'same-origin', | |
| 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1' | |
| } | |
| payload = { | |
| "model": "@cf/black-forest-labs/flux-1-schnell", | |
| "prompt": prompt, | |
| "num_steps": num_steps, | |
| "guidance": 2.0 | |
| } | |
| print(f" API request sent to {url}") | |
| resp = requests.post(url, json=payload, headers=headers, impersonate="safari") | |
| print(f" API response status: {resp.status_code}") | |
| resp.raise_for_status() | |
| try: | |
| json_resp = resp.json() | |
| print(f" JSON response keys: {list(json_resp.keys())}") | |
| if 'response' in json_resp and 'image' in json_resp['response']: | |
| image_b64 = json_resp['response']['image'] | |
| print(f" Extracted base64 image data: {len(image_b64)} chars") | |
| image_bytes = base64.b64decode(image_b64) | |
| print(f" Decoded to {len(image_bytes)} bytes") | |
| else: | |
| print(f" Unexpected JSON structure: {json_resp}") | |
| raise ValueError("No image data in response") | |
| except json.JSONDecodeError: | |
| image_bytes = resp.content | |
| print(f" Direct binary response: {len(image_bytes)} bytes") | |
| print(f" Serving {len(image_bytes)} bytes as image/png") | |
| self.send_response(200) | |
| self.send_header('Content-Type', 'image/png') | |
| self.send_header('Content-Length', len(image_bytes)) | |
| self.send_header('Cache-Control', 'no-cache') | |
| self.end_headers() | |
| self.wfile.write(image_bytes) | |
| print(f" Image served successfully") | |
| except Exception as e: | |
| print(f" ERROR: {str(e)}") | |
| self.send_response(500) | |
| self.end_headers() | |
| self.wfile.write(f'Error: {str(e)}'.encode()) | |
| def run_server(port: int = 7860): | |
| with socketserver.TCPServer(("", port), ImageHandler) as httpd: | |
| print(f"Server running at http://localhost:{port}") | |
| print(f"Usage: http://localhost:{port}/steps/4/{{your-prompt-here}}") | |
| httpd.serve_forever() | |
| if __name__ == "__main__": | |
| port = int(sys.argv[1]) if len(sys.argv) > 1 else 7860 | |
| run_server(port) | |