| import os |
| import sys |
| import requests |
| import json |
| import base64 |
| from gradio_client import Client |
|
|
| |
| raw_prompt = os.environ.get('PROMPT', '') |
| run_id = os.environ.get('RUN_ID', '') |
| space_url = os.environ.get('SPACE_URL', '') |
| github_run_id = os.environ.get('GITHUB_RUN_ID', '') |
|
|
| |
| width = 1024 |
| height = 1024 |
| user_prompt = raw_prompt |
|
|
| print('1. Parsing configuration payload...') |
| if raw_prompt.startswith("VOICECONFIG_IDEOGRAM_"): |
| try: |
| |
| if "_prompt_" in raw_prompt: |
| header, b64_prompt = raw_prompt.split("_prompt_", 1) |
| else: |
| header = raw_prompt |
| b64_prompt = "" |
| |
| config_str = header[len("VOICECONFIG_IDEOGRAM_"):] |
| parts = config_str.split("_") |
| config = {} |
| i = 0 |
| while i < len(parts) - 1: |
| key = parts[i] |
| val = parts[i+1] |
| if key: |
| config[key] = val |
| i += 2 |
| |
| width = int(config.get("width", "1024")) |
| height = int(config.get("height", "1024")) |
| |
| |
| if b64_prompt: |
| user_prompt = base64.b64decode(b64_prompt).decode('utf-8') |
| print(f" -> Parsed Persian prompt: {user_prompt}") |
| except Exception as parse_err: |
| print(f"Error parsing VOICECONFIG: {parse_err}") |
|
|
| def report_failure(error_msg): |
| try: |
| requests.post( |
| f"{space_url}/api/webhook/fail", |
| json={ |
| "run_id": run_id, |
| "error": error_msg, |
| "event_type": "ideogram", |
| "client_payload": { |
| "prompt": raw_prompt, |
| "width": width, |
| "height": height, |
| "run_id": run_id, |
| "space_url": space_url |
| }, |
| "github_run_id": github_run_id |
| }, |
| timeout=10 |
| ) |
| except Exception as e: |
| print(f"Failed to report failure to main server: {e}") |
|
|
| space_name = "ideogram-ai/ideogram4" |
| print(f"2. Connecting to official Ideogram Space: {space_name}...") |
|
|
| try: |
| client = Client(space_name) |
| |
| |
| try: |
| result = client.predict( |
| prompt=user_prompt, |
| mode="Quality · 48 steps", |
| upsampler="Ideogram (remote)", |
| width=width, |
| height=height, |
| seed=0, |
| randomize_seed=True, |
| api_name="/generate" |
| ) |
| except Exception: |
| result = client.predict( |
| user_prompt, |
| "Quality · 48 steps", |
| "Ideogram (remote)", |
| width, |
| height, |
| 0, |
| True, |
| api_name="/generate" |
| ) |
|
|
| |
| image_path = None |
| raw_json = None |
|
|
| if isinstance(result, (list, tuple)): |
| if len(result) > 0: image_path = result[0] |
| if len(result) > 2: raw_json = result[2] |
| elif isinstance(result, dict): |
| data_list = result.get("data", []) |
| if len(data_list) > 0: image_path = data_list[0] |
| if len(data_list) > 2: raw_json = data_list[2] |
| else: |
| image_path = result |
|
|
| if isinstance(image_path, dict): |
| image_path = image_path.get('path') or image_path.get('url') |
|
|
| if not image_path or not os.path.exists(str(image_path)): |
| raise Exception("Output image was not generated or file is missing.") |
|
|
| print('3. Uploading result raw image back to server...') |
| try: |
| |
| with open(image_path, 'rb') as f: |
| res_upload = requests.post( |
| f'{space_url}/api/webhook/upload', |
| data={'run_id': f"{run_id}_raw", 'github_run_id': github_run_id, 'ext': 'png'}, |
| files={'file': f}, |
| timeout=30 |
| ) |
| |
| if res_upload.status_code != 200: |
| raise Exception(f"Failed to upload image to webhook. Status: {res_upload.status_code}") |
|
|
| if raw_json: |
| print('4. Uploading JSON metadata details...') |
| meta_str = raw_json if isinstance(raw_json, str) else json.dumps(raw_json) |
| with open('meta.json', 'w', encoding='utf-8') as mf: |
| mf.write(meta_str) |
| with open('meta.json', 'rb') as mf_read: |
| requests.post( |
| f'{space_url}/api/webhook/upload', |
| data={'run_id': f'{run_id}_meta', 'github_run_id': github_run_id, 'ext': 'json'}, |
| files={'file': mf_read}, |
| timeout=20 |
| ) |
|
|
| print('5. SUCCESSFUL!') |
|
|
| except Exception as up_err: |
| raise Exception(f"Upload raw image failed: {up_err}") |
|
|
| except Exception as err: |
| err_str = str(err) |
| print(f"CRITICAL EXCEPTION OCCURRED: {err_str}") |
| report_failure(err_str) |
| sys.exit(1) |