1.新增视觉能力 2.新增对上次图片 或 上传图片 引用图片做编辑能力.

This commit is contained in:
zcr
2026-03-20 16:13:19 +08:00
parent 8e65682dba
commit adc7e70c1f
7 changed files with 362 additions and 205 deletions

View File

@@ -1,23 +1,26 @@
import logging
import os
import random
import uuid
import json
from typing import AsyncGenerator
import random
import logging
from minio import Minio
from fastapi import APIRouter
from typing import AsyncGenerator
from fastapi.responses import StreamingResponse
from langchain_core.messages import SystemMessage, AIMessageChunk, ToolMessage, AIMessage, ToolMessageChunk
from src.core.config import PROJECT_ROOT
from src.schemas.deep_agent_chat import DeepAgentChatRequest, HistoryResponse, HistoryItem
from langchain_core.messages import HumanMessage, SystemMessage, AIMessageChunk, ToolMessage, AIMessage, ToolMessageChunk
from src.core.config import PROJECT_ROOT, settings
from src.server.deep_agent.agents.main_agent import build_main_agent
from src.server.deep_agent.tools.conversation_title_tool import conversation_title
from src.server.deep_agent.tools.generate_furniture_sketch import is_image_path_exist
from src.schemas.deep_agent_chat import DeepAgentChatRequest, HistoryResponse, HistoryItem
from src.server.deep_agent.tools.extract_suggested_questions import generate_suggested_questions
from src.server.utils.new_oss_client import is_minio_file_exist, oss_upload_image_file, oss_get_image, get_presigned_url
router = APIRouter(prefix="/chat", tags=["Furniture Design Chat"])
logger = logging.getLogger(__name__)
minio_client = Minio(settings.MINIO_URL, access_key=settings.MINIO_ACCESS, secret_key=settings.MINIO_SECRET, secure=settings.MINIO_SECURE)
@router.post("/deep_agent_stream")
@@ -83,12 +86,10 @@ async def chat_stream(request: DeepAgentChatRequest):
# 1. 確定目標 thread_id
is_branching = source_thread_id and checkpoint_id
target_thread_id = str(uuid.uuid4())[:8] if is_branching else (source_thread_id or str(uuid.uuid4())[:8])
# 构建主agent
workspace_dir = os.path.join(PROJECT_ROOT, f"agent_workspace/{target_thread_id}")
print(f"target_thread_id : workspace_dir: {workspace_dir}")
logger.info(f"target_thread_id : workspace_dir: {workspace_dir}")
main_agent = build_main_agent(request.use_report, workspace_dir)
# 2. 配置參數
temp = request.config_params.temperature if request.config_params else 0.7
@@ -131,14 +132,39 @@ async def chat_stream(request: DeepAgentChatRequest):
async def event_generator() -> AsyncGenerator[str, None]:
is_first = True
new_messages = initial_messages[:] if not source_thread_id else []
new_messages.append(HumanMessage(content=request.message))
input_data = {
"messages": new_messages,
}
if request.image_url:
bucket, object_name = request.image_url.split('/', 1)
image_url = get_presigned_url(oss_client=minio_client, bucket=bucket, object_name=object_name)
new_messages = {
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": request.message},
{"type": "image_url", "image_url": {"url": image_url}}
]
},
],
"files": {
"input_image": request.image_url,
}
}
else:
new_messages = {
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": request.message},
]
},
],
"files": {
"input_image": "",
}
}
async for stream in main_agent.astream(
input_data,
new_messages,
config=current_config,
stream_mode=["updates", "messages", "custom"],
subgraphs=True
@@ -149,12 +175,10 @@ async def chat_stream(request: DeepAgentChatRequest):
is_first = False
_, mode, chunks = stream
if mode == "updates": # 只做记录 不做事件返回
print(f"[updates] {chunks}")
update_model_messages = chunks.get("model", None)
update_tools_messages = chunks.get("tools", None)
payload_out = {
"node": "",
# "checkpoint_id": current_cp_id or "unknown", TODO 替换为checkpoint_idns
"is_delta": False,
"content": "",
"type": "updates"
@@ -187,7 +211,6 @@ async def chat_stream(request: DeepAgentChatRequest):
subagent_name = metadata.get('lc_agent_name', "main")
payload_out = {
"node": subagent_name,
# "checkpoint_id": current_cp_id or "unknown", TODO 替换为checkpoint_idns
"is_delta": False,
"content": "",
"type": ""
@@ -220,7 +243,6 @@ async def chat_stream(request: DeepAgentChatRequest):
payload_out.update({
"type": "tool_call",
"is_delta": True,
# "tool_call_chunk": token.tool_call_chunks[0] if token.tool_call_chunks else None
})
yield f"data: {json.dumps(payload_out, ensure_ascii=False)}\n\n"
elif isinstance(token, ToolMessageChunk): # 工具返回
@@ -247,7 +269,6 @@ async def chat_stream(request: DeepAgentChatRequest):
elif mode == "custom":
payload_out = {
"node": "research-agent",
# "checkpoint_id": current_cp_id or "unknown", TODO 替换为checkpoint_idns
"is_delta": False,
"content": "",
"type": ""