mirror of
https://github.com/OpenBMB/ChatDev.git
synced 2026-04-25 11:18:06 +00:00
fix: websocket disconnect problem
upgrade: allow set not log_output to avoid log every node output
This commit is contained in:
parent
a96d633dff
commit
b0ccc228b4
@ -65,6 +65,7 @@ class Node(BaseConfig):
|
|||||||
type: str
|
type: str
|
||||||
description: str | None = None
|
description: str | None = None
|
||||||
# keep_context: bool = False
|
# keep_context: bool = False
|
||||||
|
log_output: bool = True
|
||||||
context_window: int = 0
|
context_window: int = 0
|
||||||
vars: Dict[str, Any] = field(default_factory=dict)
|
vars: Dict[str, Any] = field(default_factory=dict)
|
||||||
config: BaseConfig | None = None
|
config: BaseConfig | None = None
|
||||||
@ -118,6 +119,15 @@ class Node(BaseConfig):
|
|||||||
description="Number of context messages accessible during node execution. 0 means clear all context except messages with keep_message=True, -1 means unlimited, other values represent the number of context messages to keep besides those with keep_message=True.",
|
description="Number of context messages accessible during node execution. 0 means clear all context except messages with keep_message=True, -1 means unlimited, other values represent the number of context messages to keep besides those with keep_message=True.",
|
||||||
# advance=True,
|
# advance=True,
|
||||||
),
|
),
|
||||||
|
"log_output": ConfigFieldSpec(
|
||||||
|
name="log_output",
|
||||||
|
display_name="Log Output",
|
||||||
|
type_hint="bool",
|
||||||
|
required=False,
|
||||||
|
default=True,
|
||||||
|
advance=True,
|
||||||
|
description="Whether to log this node's output content. Set to false to avoid logging outputs.",
|
||||||
|
),
|
||||||
"config": ConfigFieldSpec(
|
"config": ConfigFieldSpec(
|
||||||
name="config",
|
name="config",
|
||||||
display_name="Node Configuration",
|
display_name="Node Configuration",
|
||||||
@ -170,6 +180,7 @@ class Node(BaseConfig):
|
|||||||
|
|
||||||
description = optional_str(mapping, "description", path)
|
description = optional_str(mapping, "description", path)
|
||||||
# keep_context = bool(mapping.get("keep_context", False))
|
# keep_context = bool(mapping.get("keep_context", False))
|
||||||
|
log_output = bool(mapping.get("log_output", True))
|
||||||
context_window = int(mapping.get("context_window", 0))
|
context_window = int(mapping.get("context_window", 0))
|
||||||
input_value = ensure_list(mapping.get("input"))
|
input_value = ensure_list(mapping.get("input"))
|
||||||
output_value = ensure_list(mapping.get("output"))
|
output_value = ensure_list(mapping.get("output"))
|
||||||
@ -206,6 +217,7 @@ class Node(BaseConfig):
|
|||||||
id=node_id,
|
id=node_id,
|
||||||
type=node_type,
|
type=node_type,
|
||||||
description=description,
|
description=description,
|
||||||
|
log_output=log_output,
|
||||||
input=input_messages,
|
input=input_messages,
|
||||||
output=formatted_output,
|
output=formatted_output,
|
||||||
# keep_context=keep_context,
|
# keep_context=keep_context,
|
||||||
|
|||||||
@ -844,6 +844,13 @@ const handleClickOutside = (event) => {
|
|||||||
|
|
||||||
// Add a dialogue entry
|
// Add a dialogue entry
|
||||||
const addDialogue = (name, message) => {
|
const addDialogue = (name, message) => {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const text = typeof message === 'string' ? message : String(message)
|
||||||
|
if (!text.trim()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
let avatar
|
let avatar
|
||||||
if (nameToSpriteMap.value.has(name)) {
|
if (nameToSpriteMap.value.has(name)) {
|
||||||
avatar = nameToSpriteMap.value.get(name)
|
avatar = nameToSpriteMap.value.get(name)
|
||||||
@ -857,7 +864,7 @@ const addDialogue = (name, message) => {
|
|||||||
chatMessages.value.push({
|
chatMessages.value.push({
|
||||||
type: 'dialogue',
|
type: 'dialogue',
|
||||||
name: name,
|
name: name,
|
||||||
text: message,
|
text: text,
|
||||||
avatar: avatar,
|
avatar: avatar,
|
||||||
isRight: isRight,
|
isRight: isRight,
|
||||||
timestamp: Date.now()
|
timestamp: Date.now()
|
||||||
|
|||||||
@ -49,6 +49,8 @@ class WebSocketManager:
|
|||||||
):
|
):
|
||||||
self.active_connections: Dict[str, WebSocket] = {}
|
self.active_connections: Dict[str, WebSocket] = {}
|
||||||
self.connection_timestamps: Dict[str, float] = {}
|
self.connection_timestamps: Dict[str, float] = {}
|
||||||
|
self.send_locks: Dict[str, asyncio.Lock] = {}
|
||||||
|
self.loop: asyncio.AbstractEventLoop | None = None
|
||||||
self.session_store = session_store or WorkflowSessionStore()
|
self.session_store = session_store or WorkflowSessionStore()
|
||||||
self.session_controller = session_controller or SessionExecutionController(self.session_store)
|
self.session_controller = session_controller or SessionExecutionController(self.session_store)
|
||||||
self.attachment_service = attachment_service or AttachmentService()
|
self.attachment_service = attachment_service or AttachmentService()
|
||||||
@ -65,10 +67,16 @@ class WebSocketManager:
|
|||||||
|
|
||||||
async def connect(self, websocket: WebSocket, session_id: Optional[str] = None) -> str:
|
async def connect(self, websocket: WebSocket, session_id: Optional[str] = None) -> str:
|
||||||
await websocket.accept()
|
await websocket.accept()
|
||||||
|
if self.loop is None:
|
||||||
|
try:
|
||||||
|
self.loop = asyncio.get_running_loop()
|
||||||
|
except RuntimeError:
|
||||||
|
self.loop = None
|
||||||
if not session_id:
|
if not session_id:
|
||||||
session_id = str(uuid.uuid4())
|
session_id = str(uuid.uuid4())
|
||||||
self.active_connections[session_id] = websocket
|
self.active_connections[session_id] = websocket
|
||||||
self.connection_timestamps[session_id] = time.time()
|
self.connection_timestamps[session_id] = time.time()
|
||||||
|
self.send_locks[session_id] = asyncio.Lock()
|
||||||
logging.info("WebSocket connected: %s", session_id)
|
logging.info("WebSocket connected: %s", session_id)
|
||||||
await self.send_message(
|
await self.send_message(
|
||||||
session_id,
|
session_id,
|
||||||
@ -90,6 +98,8 @@ class WebSocketManager:
|
|||||||
del self.active_connections[session_id]
|
del self.active_connections[session_id]
|
||||||
if session_id in self.connection_timestamps:
|
if session_id in self.connection_timestamps:
|
||||||
del self.connection_timestamps[session_id]
|
del self.connection_timestamps[session_id]
|
||||||
|
if session_id in self.send_locks:
|
||||||
|
del self.send_locks[session_id]
|
||||||
self.session_controller.cleanup_session(session_id)
|
self.session_controller.cleanup_session(session_id)
|
||||||
remaining_session = self.session_store.get_session(session_id)
|
remaining_session = self.session_store.get_session(session_id)
|
||||||
if remaining_session and remaining_session.executor is None:
|
if remaining_session and remaining_session.executor is None:
|
||||||
@ -101,6 +111,11 @@ class WebSocketManager:
|
|||||||
if session_id in self.active_connections:
|
if session_id in self.active_connections:
|
||||||
websocket = self.active_connections[session_id]
|
websocket = self.active_connections[session_id]
|
||||||
try:
|
try:
|
||||||
|
lock = self.send_locks.get(session_id)
|
||||||
|
if lock is None:
|
||||||
|
await websocket.send_text(_encode_ws_message(message))
|
||||||
|
else:
|
||||||
|
async with lock:
|
||||||
await websocket.send_text(_encode_ws_message(message))
|
await websocket.send_text(_encode_ws_message(message))
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
@ -115,6 +130,12 @@ class WebSocketManager:
|
|||||||
else:
|
else:
|
||||||
asyncio.run(self.send_message(session_id, message))
|
asyncio.run(self.send_message(session_id, message))
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
|
if self.loop and self.loop.is_running():
|
||||||
|
asyncio.run_coroutine_threadsafe(
|
||||||
|
self.send_message(session_id, message),
|
||||||
|
self.loop,
|
||||||
|
)
|
||||||
|
else:
|
||||||
asyncio.run(self.send_message(session_id, message))
|
asyncio.run(self.send_message(session_id, message))
|
||||||
|
|
||||||
async def broadcast(self, message: Dict[str, Any]) -> None:
|
async def broadcast(self, message: Dict[str, Any]) -> None:
|
||||||
|
|||||||
@ -626,7 +626,7 @@ class GraphExecutor:
|
|||||||
output_role = "none"
|
output_role = "none"
|
||||||
output_source = None
|
output_source = None
|
||||||
|
|
||||||
self.log_manager.record_node_end(node.id, output_text, {
|
self.log_manager.record_node_end(node.id, output_text if node.log_output else "", {
|
||||||
"output_size": len(output_text),
|
"output_size": len(output_text),
|
||||||
"output_count": len(output_messages),
|
"output_count": len(output_messages),
|
||||||
"output_role": output_role,
|
"output_role": output_role,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user