1.新增视觉能力 2.新增对上次图片 或 上传图片 引用图片做编辑能力.
This commit is contained in:
@@ -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": ""
|
||||
|
||||
Reference in New Issue
Block a user