{"repo": "chenpx976/comfyui-anytextapi", "files": {"__init__.py": {"71c066ce149998ed4acade33a331e42ea9e36a3d": {"t": 1785674240.3313937, "n": 6482, "h": "ead9d5c8a68c0d0c", "c": "import json\n\nfrom PIL import Image, ImageOps\nimport numpy as np\nimport time\nimport torch\nimport requests\nimport io\n\n\n# 通过 URL 获取图片\ndef get_image_from_url(url):\n response = requests.get(url, timeout=5)\n if response.status_code != 200:\n raise Exception(response.text)\n\n i = Image.open(io.BytesIO(response.content))\n\n i = ImageOps.exif_transpose(i)\n\n if i.mode != \"RGBA\":\n i = i.convert(\"RGBA\")\n\n # recreate image to fix weird RGB image\n alpha = i.split()[-1]\n image = Image.new(\"RGB\", i.size, (0, 0, 0))\n image.paste(i, mask=alpha)\n\n image = np.array(image).astype(np.float32) / 255.0\n image = torch.from_numpy(image)[None,]\n if \"A\" in i.getbands():\n mask = np.array(i.getchannel(\"A\")).astype(np.float32) / 255.0\n mask = 1.0 - torch.from_numpy(mask)\n else:\n mask = torch.zeros((64, 64), dtype=torch.float32, device=\"cpu\")\n\n return image, mask\n\n\ndef send_request(input, parameters, api_key):\n data = json.dumps({\n \"model\": \"wanx-anytext-v1\",\n \"input\": input,\n \"parameters\": parameters\n })\n # 发送请求\n print('Sending request:data', data)\n # cURL\n # POST https://dashscope.aliyuncs.com/api/v1/services/aigc/anytext/generation\n try:\n response = requests.post(\n url=\"https://dashscope.aliyuncs.com/api/v1/services/aigc/anytext/generation\",\n headers={\n \"X-Dashscope-Async\": \"enable\",\n \"Authorization\": \"Bearer \" + api_key,\n \"Content-Type\": \"application/json\",\n },\n data=data\n )\n if response.status_code == 200:\n print('Request was successful')\n content = json.loads(response.content)\n # 如果HTTP响应状态码为200,则表示请求成功 执行下一步, 从 response.content 拿出来 output 的 task_id 作为下一步的输入\n print(content)\n task_id = content['output']['task_id']\n print(task_id)\n return task_id\n else:\n print('Response HTTP Status Code: {status_code}'.format(\n status_code=response.status_code))\n print('Response HTTP Response Body: {content}'.format(\n content=response.content))\n except requests.exceptions.RequestException:\n print('HTTP Request failed')\n\n\nclass AnyTextAPI_Node:\n\n def __init__(self):\n pass\n\n @classmethod\n def INPUT_TYPES(cls):\n return {\n \"required\": {\n \"prompt\": (\"STRING\", {\"multiline\": True, \"default\": \"\"}),\n \"mask_image_url\": (\"STRING\", {\"default\": \"\"}),\n \"base_image_url\": (\"STRING\", {\"default\": \"\"}),\n \"appended_prompt\": (\"STRING\", {\"multiline\": True, \"default\": \"\"}),\n \"negative_prompt\": (\"STRING\", {\"multiline\": True, \"default\": \"\"}),\n \"layout_priority\": ([\"vertical\", \"horizontal\"], {\"default\": \"vertical\"}),\n \"steps\": (\"INT\", {\"default\": 20, \"min\": 1, \"max\": 100}),\n \"seed\": (\"INT\", {\"default\": -1, \"min\": -1, \"max\": 99999999}),\n \"api_key\": (\"STRING\", {\"default\": \"sk-\"}),\n \"image_width\": (\"INT\", {\"default\": 512, \"min\": 64, \"max\": 7000}),\n \"image_height\": (\"INT\", {\"default\": 512, \"min\": 64, \"max\": 7000}),\n \"max_retries\": (\"INT\", {\"default\": 100, \"min\": 1, \"max\": 1000}),\n },\n }\n\n RETURN_TYPES = (\"IMAGE\", \"MASK\")\n RETURN_NAMES = (\"image\", \"mask\")\n CATEGORY = \"AnyTextAPI_Node\"\n FUNCTION = \"execute\"\n\n def execute(self, prompt, mask_image_url, base_image_url, appended_prompt, negative_prompt, layout_priority, steps,\n seed, api_key, image_width, image_height, max_retries):\n print('Requesting image generation')\n params = {\n \"input\": {\n\n },\n \"parameters\": {\n\n },\n \"api_key\": api_key\n }\n if prompt:\n params[\"input\"][\"prompt\"] = prompt\n if base_image_url:\n params[\"input\"][\"base_image_url\"] = base_image_url\n if mask_image_url:\n params[\"input\"][\"mask_image_url\"] = mask_image_url\n if appended_prompt:\n params[\"input\"][\"appended_prompt\"] = appended_prompt\n if negative_prompt:\n params[\"input\"][\"negative_prompt\"] = negative_prompt\n if layout_priority:\n params[\"parameters\"][\"layout_priority\"] = layout_priority\n if steps:\n params[\"parameters\"][\"steps\"] = steps\n if seed:\n params[\"parameters\"][\"seed\"] = seed\n\n print('Looping request', params)\n api_key = params['api_key']\n task_id = send_request(params['input'], params['parameters'], api_key)\n loop = True\n while loop and max_retries > 0:\n try:\n response = requests.get(\n url=\"https://dashscope.aliyuncs.com/api/v1/tasks/\" + task_id,\n headers={\n \"X-Dashscope-Async\": \"enable\",\n \"Authorization\": \"Bearer \" + api_key,\n \"Content-Type\": \"application/json\",\n },\n )\n # 从 response.content 拿出来 output 的 task_status 和 result_url\n content = json.loads(response.content)\n print(content)\n task_status = content['output']['task_status']\n if task_status == 'SUCCEEDED':\n print('Task is SUCCEEDED')\n result_url = content['output']['result_url'][0]\n print('Result URL: ' + result_url)\n loop = False\n return get_image_from_url(result_url)\n # 如果 task_status 是 FAILED, 则打印错误信息并退出\n elif task_status == 'FAILED':\n print('Task is FAILED')\n print('Error: ' + content['output']['message'])\n loop = False\n else:\n print('Task is still running')\n # 延迟1秒\n time.sleep(1)\n max_retries -= 1\n if max_retries == 0:\n print('Max retries reached')\n return None\n except requests.exceptions.RequestException:\n print('HTTP Request failed')\n\n\n# Node class and display name mappings\nNODE_CLASS_MAPPINGS = {\n \"AnyTextAPI_Node\": AnyTextAPI_Node,\n}\nNODE_DISPLAY_NAME_MAPPINGS = {\n \"AnyTextAPI_Node\": \"AnyTextAPI\",\n}\n"}}}}