Spaces:
Runtime error
Runtime error
# img_bot.py | |
import discord, os, io, re, asyncio, logging, requests, replicate, subprocess | |
from transformers import pipeline as transformers_pipeline | |
# ββ νκ²½ λ³μ ββββββββββββββββββββββββββββββββββββββββββββββββ | |
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 ν ν° | |
# message_content μΈν νΈ μ¬μ© μ¬λΆ(1 = ON, 0 = OFF) | |
USE_MSG_INTENT = os.getenv("MESSAGE_CONTENT_INTENT", "1") != "0" | |
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 | |
# ββ λͺ¨λΈ ββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
MODEL = ( | |
"bytedance/sdxl-lightning-4step:" | |
"6f7a773af6fc3e8de9d5a3c00be77c17308914bf67772726aff83496ba1e3bbe" | |
) | |
# ββ λ²μ νμ΄νλΌμΈ (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", | |
handlers=[logging.StreamHandler()] | |
) | |
# ββ Discord μ€μ ββββββββββββββββββββββββββββββββββββββββββββ | |
intents = discord.Intents.default() | |
if USE_MSG_INTENT: | |
intents.message_content = True | |
logging.info("Message Content Intent = ON " | |
"(Discord Developer Portal β Bot β Privileged Intents μμ νμ±ν νμ)") | |
else: | |
logging.info("Message Content Intent = OFF (MESSAGE_CONTENT_INTENT=0)") | |
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): | |
# μΈν νΈ OFF μ ν둬ννΈλ₯Ό μ½μ μ μμΌλ―λ‘ μ¦μ λ°ν | |
if not USE_MSG_INTENT: | |
return | |
# λ΄ μμ μ λ©μμ§ λλ λ€λ₯Έ μ±λ λ©μμ§ β 무μ | |
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() | |
# ββ Replicate νΈμΆ ββββββββββββββββββββββββββββββββββ | |
def run_replicate(): | |
return list(replicate.run(MODEL, input={"prompt": prompt_en})) | |
try: | |
images = await asyncio.get_running_loop().run_in_executor(None, run_replicate) | |
except Exception as e: | |
logging.error(f"Replicate error: {e}") | |
await message.reply("β οΈ μ΄λ―Έμ§ μμ± μ€ν¨!") | |
return | |
# ββ Discord νμΌ μ λ‘λ βββββββββββββββββββββββββββββ | |
files = [] | |
for idx, item in enumerate(images): | |
try: | |
data = item.read() if hasattr(item, "read") else requests.get(item).content | |
files.append(discord.File(io.BytesIO(data), filename=f"img_{idx}.png")) | |
except Exception as e: | |
logging.warning(f"[IMG {idx}] μ²λ¦¬ μ€ν¨: {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) | |