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