"""
id: image_gen
title: 图像生成器 / Image Generator
author: open-webui
author_url: https://github.com/open-webui
funding_url: https://github.com/open-webui
version: 0.3
required_open_webui_version: 0.5.3
description: 在用户明确要求时生成图像。中文触发词:生成图片、画一个、创建图像等。英文:generate image, create picture等
keywords: 图片, 图像, 生成, 画, image, generate, create, draw
"""
import re
from typing import Callable
from fastapi import Request
from open_webui.routers.images import image_generations, GenerateImageForm
from open_webui.models.users import Users
class Tools:
def __init__(self):
"""初始化工具"""
# 中文图像生成模式
self.image_request_patterns = [
# 中文模式
r"(请|帮我|给我|能不能|可以|麻烦).*(生成|创建|画|绘制|制作|做).*(图片|图像|图|画|照片|插图)",
r"(生成|创建|画|绘制|制作|做).*(图片|图像|图|画面|照片)",
r"(画|来|做|生成)一(个|张|幅|些)",
r"想要.*(图片|图像|画|插图)",
r"需要.*(图片|图像|插图|配图)",
# 英文模式
r"(generate|create|draw|make|design).*(image|picture|illustration|photo)",
r"(image|picture) of",
r"(show|give) me.*(image|picture|visual)",
]
# 否定模式(不应该触发)
self.negative_patterns = [
r"(不要|不用|不需要|别|无需).*(图|画|生成)",
r"(什么是|如何|怎么).*(图片|图像)", # 询问性质的
r"(图片|图像).*(格式|大小|尺寸)", # 讨论图片属性
]
def should_generate_image(self, prompt: str) -> bool:
"""判断是否应该生成图像"""
# 先检查否定模式
for pattern in self.negative_patterns:
if re.search(pattern, prompt, re.IGNORECASE):
return False
# 检查肯定模式
for pattern in self.image_request_patterns:
if re.search(pattern, prompt, re.IGNORECASE):
return True
return False
async def generate_image(
self, prompt: str, __request__: Request, __user__: dict, __event_emitter__=None
) -> str:
"""
图像生成工具 - 仅在明确请求时使用
使用示例:
✅ "请帮我画一个美丽的风景"
✅ "生成一张猫的图片"
✅ "创建一个科幻风格的城市图像"
❌ "告诉我关于图片的信息"
❌ "图片格式有哪些"
:param prompt: 图像描述
:return: 生成状态
"""
# 检查是否真的需要生成图像
if not self.should_generate_image(prompt):
return (
"我理解您的请求,但这似乎不需要生成图像。\n"
"如果您确实想要生成图片,请使用类似这样的表达:\n"
"- '请帮我画一个...'\n"
"- '生成一张...的图片'\n"
"- '创建一个...的图像'"
)
# 执行图像生成
if __event_emitter__:
await __event_emitter__(
{
"type": "status",
"data": {"description": "正在生成图像... 🎨", "done": False},
}
)
try:
images = await image_generations(
request=__request__,
form_data=GenerateImageForm(prompt=prompt),
user=Users.get_user_by_id(__user__["id"]),
)
if __event_emitter__:
await __event_emitter__(
{
"type": "status",
"data": {"description": "图像生成完成!✨", "done": True},
}
)
if images:
for image in images:
if __event_emitter__:
await __event_emitter__(
{
"type": "message",
"data": {"content": f""},
}
)
return f"成功生成了 {len(images)} 张图片"
else:
return "未能生成图片,请稍后重试"
except Exception as e:
error_msg = f"生成图像时出错:{str(e)}"
if __event_emitter__:
await __event_emitter__(
{
"type": "status",
"data": {"description": error_msg, "done": True},
}
)
return error_msg