From 2acbd4b93a00f8823b47c7a4f905370c19b069ce Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Sun, 7 Sep 2025 20:25:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0HOST=5FIP=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E6=94=AF=E6=8C=81=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=9B=BE=E7=89=87=E7=94=9F=E6=88=90=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在docker-compose中添加HOST_IP环境变量配置 - 修改minio_utils以支持通过HOST_IP配置公开端点 - 移除本地MCP服务器配置 - 将text_to_img工具替换为基于Kolors API的实现 --- docker-compose.yml | 1 + src/agents/chatbot/tools.py | 60 +++++++++++++++++++++---------------- src/agents/common/mcp.py | 11 +++---- src/utils/minio_utils.py | 3 +- 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index df76cb3b..829231f3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,6 +24,7 @@ services: env_file: - src/.env environment: + - HOST_IP=${HOST_IP:-} - NEO4J_URI=${NEO4J_URI:-bolt://graph:7687} - NEO4J_USERNAME=${NEO4J_USERNAME:-neo4j} - NEO4J_PASSWORD=${NEO4J_PASSWORD:-0123456789} diff --git a/src/agents/chatbot/tools.py b/src/agents/chatbot/tools.py index a6e0d1a3..756f0564 100644 --- a/src/agents/chatbot/tools.py +++ b/src/agents/chatbot/tools.py @@ -1,8 +1,9 @@ -from io import BytesIO +import os +import requests + from typing import Any from langchain_core.tools import tool -from PIL import Image, ImageDraw, ImageFont from src.agents.common.tools import get_buildin_tools from src.utils import logger @@ -29,35 +30,42 @@ def calculator(a: float, b: float, operation: str) -> float: logger.error(f"Calculator error: {e}") raise - @tool -async def text_to_img(text: str) -> str: - """ - 文生图函数,根据文本生成一张包含该文本的图片,并将其上传到文件服务器,最终返回图片的公开访问 URL。 - A text-to-image function that generates an image containing the given text, - uploads it to a file server, and returns the public URL of the image. - """ - logger.info(f"Generating image for text: {text}") - # 1. Simulate image generation using Pillow - try: - img = Image.new("RGB", (400, 100), color=(73, 109, 137)) - draw = ImageDraw.Draw(img) - try: - font = ImageFont.truetype("arial.ttf", 15) - except OSError: - font = ImageFont.load_default() - draw.text((10, 10), f"Generated from: {text}", fill=(255, 255, 0), font=font) +async def text_to_img_kolors(text: str) -> str: + """(用来测试文件存储)使用Kolors模型生成图片, 会返回图片的URL""" - img_bytes = BytesIO() - img.save(img_bytes, format="JPEG") - img_bytes.seek(0) - file_data = img_bytes.read() - logger.info("Image data generated successfully.") + url = "https://api.siliconflow.cn/v1/images/generations" + + payload = { + "model": "Kwai-Kolors/Kolors", + "prompt": text, + "image_size": "512x512", + "batch_size": 1, + "num_inference_steps": 20, + "guidance_scale": 7.5 + } + headers = { + "Authorization": f"Bearer {os.getenv('SILICONFLOW_API_KEY')}", + "Content-Type": "application/json" + } + + try: + response = requests.post(url, json=payload, headers=headers) + response_json = response.json() except Exception as e: - logger.error(f"Failed to generate image with Pillow: {e}") + logger.error(f"Failed to generate image with Kolors: {e}") raise ValueError(f"Image generation failed: {e}") + try: + image_url = response_json["images"][0]["url"] + except (KeyError, IndexError, TypeError) as e: + logger.error(f"Failed to parse image URL from Kolors response: {e}, {response_json=}") + raise ValueError(f"Image URL extraction failed: {e}") + # 2. Upload to MinIO (Simplified) + response = requests.get(image_url) + file_data = response.content + image_url = upload_image_to_minio(data=file_data, file_extension="jpg") logger.info(f"Image uploaded. URL: {image_url}") return image_url @@ -67,5 +75,5 @@ def get_tools() -> list[Any]: """获取所有可运行的工具(给大模型使用)""" tools = get_buildin_tools() tools.append(calculator) - tools.append(text_to_img) + tools.append(text_to_img_kolors) return tools diff --git a/src/agents/common/mcp.py b/src/agents/common/mcp.py index 84e88896..c87d3858 100644 --- a/src/agents/common/mcp.py +++ b/src/agents/common/mcp.py @@ -18,11 +18,12 @@ MCP_SERVERS = { "url": "https://remote.mcpservers.org/sequentialthinking/mcp", "transport": "streamable_http", }, - "time": { - "command": "uvx", - "args": ["mcp-server-time"], - "transport": "stdio", - }, + # 这些 stdio 的 MCP server 需要在本地启动,启动的时候需要安装对应的包,需要时间 + # "time": { + # "command": "uvx", + # "args": ["mcp-server-time"], + # "transport": "stdio", + # }, } diff --git a/src/utils/minio_utils.py b/src/utils/minio_utils.py index dd03ffc4..39d99731 100644 --- a/src/utils/minio_utils.py +++ b/src/utils/minio_utils.py @@ -27,7 +27,8 @@ class _MinioClient: self.secret_key = os.getenv("MINIO_SECRET_KEY", "minioadmin") if os.getenv("RUNNING_IN_DOCKER"): - self.public_endpoint = f"localhost:{self.endpoint.split(':')[-1]}" + host_ip = os.getenv("HOST_IP", "localhost") + self.public_endpoint = f"{host_ip}:{self.endpoint.split(':')[-1]}" else: self.public_endpoint = self.endpoint