Spaces:
Runtime error
Runtime error
File size: 5,743 Bytes
49ec9dc 6659834 49ec9dc 6659834 49ec9dc 898a986 49ec9dc 6659834 49ec9dc 6659834 49ec9dc 0b58fc4 49ec9dc 9d6ae27 49ec9dc 6659834 49ec9dc 9d6ae27 49ec9dc 6659834 49ec9dc 6659834 49ec9dc 2edcd19 49ec9dc 6659834 49ec9dc 6659834 49ec9dc 6659834 49ec9dc 6659834 49ec9dc 6659834 49ec9dc 6659834 49ec9dc 9d6ae27 49ec9dc 6659834 49ec9dc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# img_bot.py
import discord, os, io, re, random, asyncio, logging, requests, replicate, subprocess
from transformers import pipeline as transformers_pipeline # λ²μ νμ΄νλΌμΈ
from gradio_client import Client, handle_file # NEW β Gradio API
# ββ νκ²½ λ³μ ββββββββββββββββββββββββββββββββββββββββββββββββ
TOKEN = os.getenv("DISCORD_TOKEN") # Discord λ΄ ν ν°
CHANNEL_ID = int(os.getenv("DISCORD_CHANNEL_ID")) # κ°μν μ±λ ID
REPL_TOKEN = (os.getenv("OPENAI_API_KEY") or "").strip() # κ·Έλλ‘ μ μ§(Replicate ν ν°)
HF_TOKEN = (os.getenv("HF_TOKEN") or "").strip() # Hugging Face Personal Access Token
if not TOKEN or not CHANNEL_ID:
raise RuntimeError("DISCORD_TOKEN κ³Ό DISCORD_CHANNEL_ID νκ²½ λ³μλ₯Ό λͺ¨λ μ§μ νμΈμ.")
if not REPL_TOKEN:
raise RuntimeError("OPENAI_API_KEY νκ²½ λ³μμ Replicate Personal Access Token κ°μ λ£μ΄μ£ΌμΈμ.")
# Replicate λΌμ΄λΈλ¬λ¦¬κ° μ°Έμ‘°νλλ‘ ν ν° μ£Όμ
(λΉλ‘ μ¬μ© μ νμ§λ§ ꡬ쑰 μ μ§)
os.environ["REPLICATE_API_TOKEN"] = REPL_TOKEN
# ββ Gradio μλ² μλν¬μΈνΈ ββββββββββββββββββββββββββββββββββ
GRADIO_URL = "http://211.233.58.201:7896" # μλ² μ£Όμ
GRADIO_API = "/generate_image" # μ¬μ©ν ν¨μ μ΄λ¦
# ββ λ²μ νμ΄νλΌμΈ (CPU) βββββββββββββββββββββββββββββββββββ
translator_kwargs = {"device": -1}
if HF_TOKEN:
translator_kwargs["token"] = HF_TOKEN
translator = transformers_pipeline(
"translation", model="Helsinki-NLP/opus-mt-ko-en", **translator_kwargs
)
def ko2en(text: str) -> str:
"""ν둬ννΈμ νκΈμ΄ μμΌλ©΄ μμ΄λ‘ λ²μ."""
if re.search(r"[κ°-ν£]", text):
try:
return translator(text, max_length=512)[0]["translation_text"].strip()
except Exception as e:
logging.warning(f"λ²μ μ€ν¨, μλ¬Έ μ¬μ©: {e}")
return text
# ββ λ‘κΉ
ββββββββββββββββββββββββββββββββββββββββββββββββββββ
logging.basicConfig(level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s")
# ββ Discord μΈν
νΈ ββββββββββββββββββββββββββββββββββββββββββ
intents = discord.Intents.default()
intents.message_content = True # λ©μμ§ μ½κΈ° (Portalμμ ON νμ)
class ImageBot(discord.Client):
async def on_ready(self):
logging.info(f"Logged in as {self.user} (id={self.user.id})")
# web.py λ³λ ¬ μ€ν
try:
subprocess.Popen(["python", "web.py"])
logging.info("web.py server has been started.")
except Exception as e:
logging.warning(f"web.py μ€ν μ€ν¨: {e}")
async def on_message(self, message: discord.Message):
if message.author.id == self.user.id or message.channel.id != CHANNEL_ID:
return
prompt_raw = message.content.strip()
if not prompt_raw:
return
prompt_en = ko2en(prompt_raw) # νκΈ β μμ΄
await message.channel.typing()
# ββ Gradio νΈμΆ ββββββββββββββββββββββββββββββββββββ
def generate_image():
client = Client(GRADIO_URL)
seed = random.randint(0, 2**32 - 1)
result = client.predict(
prompt=prompt_en,
width=768,
height=768,
guidance=3.5,
inference_steps=30,
seed=seed,
do_img2img=False,
init_image=None, # img2img μ¬μ© μ ν¨
image2image_strength=0.8,
resize_img=True,
api_name=GRADIO_API
)
return result[0] # dict (path / url)
try:
img_info = await asyncio.get_running_loop().run_in_executor(None, generate_image)
except Exception as e:
logging.error(f"Gradio API error: {e}")
await message.reply("β οΈ μ΄λ―Έμ§ μμ± μ€ν¨!")
return
# ββ μ΄λ―Έμ§ Discord μ μ‘ βββββββββββββββββββββββββββββ
files = []
try:
if img_info.get("path"): # μλ²κ° νμΌ κ²½λ‘λ‘ λ°ν
with open(img_info["path"], "rb") as f:
files.append(discord.File(io.BytesIO(f.read()), filename="generated.webp"))
elif img_info.get("url"): # URL λλ base64
data = requests.get(img_info["url"]).content
files.append(discord.File(io.BytesIO(data), filename="generated.webp"))
except Exception as e:
logging.warning(f"μ΄λ―Έμ§ μ²λ¦¬ μ€ν¨: {e}")
await message.reply(files=files if files else None,
content=None if files else "β οΈ μ΄λ―Έμ§λ₯Ό μ μ‘ν μ μμ΅λλ€.")
# ββ μ€ν ββββββββββββββββββββββββββββββββββββββββββββββββββββ
if __name__ == "__main__":
replicate.Client(api_token=REPL_TOKEN) # ꡬ쑰 μ μ§: Replicate μΈμ¦(λ―Έμ¬μ©)
ImageBot(intents=intents).run(TOKEN)
|