Files
Bubbles/image/img_cogview.py
2025-04-23 13:30:10 +08:00

100 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import logging
import os
import requests
import tempfile
import time
from zhipuai import ZhipuAI
class CogView():
def __init__(self, conf: dict) -> None:
self.api_key = conf.get("api_key")
self.model = conf.get("model", "cogview-4-250304") # 默认使用最新模型
self.quality = conf.get("quality", "standard")
self.size = conf.get("size", "1024x1024")
self.enable = conf.get("enable", True)
project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
default_img_dir = os.path.join(project_dir, "zhipuimg")
self.temp_dir = conf.get("temp_dir", default_img_dir)
self.LOG = logging.getLogger("CogView")
if self.api_key:
self.client = ZhipuAI(api_key=self.api_key)
else:
self.LOG.warning("未配置智谱API密钥图像生成功能无法使用")
self.client = None
os.makedirs(self.temp_dir, exist_ok=True)
@staticmethod
def value_check(conf: dict) -> bool:
if conf and conf.get("api_key") and conf.get("enable", True):
return True
return False
def __repr__(self):
return 'CogView'
def generate_image(self, prompt: str) -> str:
"""
生成图像并返回图像URL
Args:
prompt (str): 图像描述
Returns:
str: 生成的图像URL或错误信息
"""
if not self.client or not self.enable:
return "图像生成功能未启用或API密钥未配置"
try:
response = self.client.images.generations(
model=self.model,
prompt=prompt,
quality=self.quality,
size=self.size,
)
if response and response.data and len(response.data) > 0:
return response.data[0].url
else:
return "图像生成失败,未收到有效响应"
except Exception as e:
error_str = str(e)
self.LOG.error(f"图像生成出错: {error_str}")
if "Error code: 500" in error_str or "HTTP/1.1 500" in error_str or "code\":\"1234\"" in error_str:
self.LOG.warning(f"检测到违规内容请求: {prompt}")
return "很抱歉,您的请求可能包含违规内容,无法生成图像"
return "图像生成失败,请调整您的描述后重试"
def download_image(self, image_url: str) -> str:
"""
下载图片并返回本地文件路径
Args:
image_url (str): 图片URL
Returns:
str: 本地图片文件路径下载失败则返回None
"""
try:
response = requests.get(image_url, stream=True, timeout=30)
if response.status_code == 200:
file_path = os.path.join(self.temp_dir, f"cogview_{int(time.time())}.jpg")
with open(file_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
self.LOG.info(f"图片已下载到: {file_path}")
return file_path
else:
self.LOG.error(f"下载图片失败,状态码: {response.status_code}")
return None
except Exception as e:
self.LOG.error(f"下载图片过程出错: {str(e)}")
return None