Refactor async execution and add error handling
This commit is contained in:
parent
1934a77ffa
commit
4b9d402b71
1 changed files with 37 additions and 10 deletions
|
|
@ -2,8 +2,8 @@ from typing import Any, Optional, Union
|
||||||
|
|
||||||
from langchain_core.messages import BaseMessage
|
from langchain_core.messages import BaseMessage
|
||||||
from langchain_core.runnables import Runnable
|
from langchain_core.runnables import Runnable
|
||||||
from langflow.services.deps import get_socket_service
|
|
||||||
from langflow.utils.constants import PYTHON_BASIC_TYPES
|
from langflow.utils.constants import PYTHON_BASIC_TYPES
|
||||||
|
from loguru import logger
|
||||||
|
|
||||||
|
|
||||||
def is_basic_type(obj):
|
def is_basic_type(obj):
|
||||||
|
|
@ -11,16 +11,43 @@ def is_basic_type(obj):
|
||||||
|
|
||||||
|
|
||||||
async def invoke_lc_runnable(
|
async def invoke_lc_runnable(
|
||||||
built_object: Runnable, inputs: dict, has_external_output: bool, session_id: Optional[str] = None
|
langchain_object: Runnable, inputs: dict, has_external_output: bool, session_id: Optional[str] = None, **kwargs
|
||||||
) -> Union[str, BaseMessage]:
|
) -> Union[str, BaseMessage]:
|
||||||
if has_external_output:
|
# Setup callbacks for asynchronous execution
|
||||||
socketio_service = get_socket_service()
|
from langflow.processing.base import setup_callbacks
|
||||||
result = ""
|
|
||||||
stream = built_object.astream(inputs)
|
callbacks = setup_callbacks(sync=False, trace_id=session_id, **kwargs)
|
||||||
async for chunk in stream:
|
|
||||||
await socketio_service.emit_token(session_id, chunk)
|
try:
|
||||||
result += chunk
|
if has_external_output and hasattr(langchain_object, "astream"):
|
||||||
return await built_object.ainvoke(inputs)
|
# Asynchronous stream handling if supported and required
|
||||||
|
output = ""
|
||||||
|
async for chunk in langchain_object.astream(inputs, {"callbacks": callbacks}):
|
||||||
|
output += chunk
|
||||||
|
return output
|
||||||
|
else:
|
||||||
|
# Direct asynchronous invocation
|
||||||
|
return await langchain_object.ainvoke(inputs, {"callbacks": callbacks})
|
||||||
|
except Exception as async_exc:
|
||||||
|
logger.debug(f"Async error, falling back to sync: {str(async_exc)}")
|
||||||
|
|
||||||
|
# Setup synchronous callbacks for the fallback
|
||||||
|
sync_callbacks = setup_callbacks(sync=True, trace_id=session_id, **kwargs)
|
||||||
|
try:
|
||||||
|
# Synchronous fallback if asynchronous execution fails
|
||||||
|
if has_external_output and hasattr(langchain_object, "stream"):
|
||||||
|
# Synchronous stream handling if supported and required
|
||||||
|
output = ""
|
||||||
|
for chunk in langchain_object.stream(inputs, {"callbacks": sync_callbacks}):
|
||||||
|
output += chunk
|
||||||
|
return output
|
||||||
|
else:
|
||||||
|
# Direct synchronous invocation
|
||||||
|
return langchain_object.invoke(inputs, {"callbacks": sync_callbacks})
|
||||||
|
except Exception as sync_exc:
|
||||||
|
logger.error(f"Sync error after async failure: {str(sync_exc)}")
|
||||||
|
# Handle or re-raise exception as appropriate for your application
|
||||||
|
raise sync_exc from async_exc
|
||||||
|
|
||||||
|
|
||||||
async def generate_result(built_object: Any, inputs: dict, has_external_output: bool, session_id: Optional[str] = None):
|
async def generate_result(built_object: Any, inputs: dict, has_external_output: bool, session_id: Optional[str] = None):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue