From 97cfc9f367f2bcac44c09bc9af4d58d7672ae0d1 Mon Sep 17 00:00:00 2001 From: Andreas Klos Date: Tue, 2 Sep 2025 06:52:56 +0200 Subject: [PATCH] refactor: replace AsyncChain with AsyncRunnable and update related classes for improved structure and tracing capabilities --- libs/admin-api-lib/src/admin_api_lib/dependency_container.py | 4 ++-- .../information_enhancer/information_enhancer.py | 4 ++-- libs/admin-api-lib/src/admin_api_lib/summarizer/summarizer.py | 4 ++-- libs/rag-core-api/src/rag_core_api/dependency_container.py | 4 ++-- libs/rag-core-api/src/rag_core_api/graph/graph_base.py | 4 ++-- .../impl/answer_generation_chains/answer_generation_chain.py | 4 ++-- .../impl/answer_generation_chains/rephrasing_chain.py | 4 ++-- .../src/rag_core_api/impl/api_endpoints/default_chat.py | 4 ++-- .../{langfuse_traced_chain.py => langfuse_traced_runnable.py} | 4 ++-- .../src/rag_core_lib/{chains => runnables}/__init__.py | 0 .../{chains/async_chain.py => runnables/async_runnable.py} | 2 +- .../tracers/{traced_chain.py => traced_runnable.py} | 4 ++-- services/rag-backend/chat_endpoint.py | 4 ++-- 13 files changed, 23 insertions(+), 23 deletions(-) rename libs/rag-core-lib/src/rag_core_lib/impl/tracers/{langfuse_traced_chain.py => langfuse_traced_runnable.py} (93%) rename libs/rag-core-lib/src/rag_core_lib/{chains => runnables}/__init__.py (100%) rename libs/rag-core-lib/src/rag_core_lib/{chains/async_chain.py => runnables/async_runnable.py} (97%) rename libs/rag-core-lib/src/rag_core_lib/tracers/{traced_chain.py => traced_runnable.py} (94%) diff --git a/libs/admin-api-lib/src/admin_api_lib/dependency_container.py b/libs/admin-api-lib/src/admin_api_lib/dependency_container.py index feee4cd8..798cda18 100644 --- a/libs/admin-api-lib/src/admin_api_lib/dependency_container.py +++ b/libs/admin-api-lib/src/admin_api_lib/dependency_container.py @@ -65,7 +65,7 @@ from rag_core_lib.impl.settings.ollama_llm_settings import OllamaSettings from rag_core_lib.impl.settings.rag_class_types_settings import RAGClassTypeSettings from rag_core_lib.impl.settings.stackit_vllm_settings import StackitVllmSettings -from rag_core_lib.impl.tracers.langfuse_traced_chain import LangfuseTracedGraph +from rag_core_lib.impl.tracers.langfuse_traced_runnable import LangfuseTracedRunnable from rag_core_lib.impl.utils.async_threadsafe_semaphore import AsyncThreadsafeSemaphore @@ -147,7 +147,7 @@ class DependencyContainer(DeclarativeContainer): summary_enhancer, ) information_enhancer = Singleton( - LangfuseTracedGraph, + LangfuseTracedRunnable, inner_chain=untraced_information_enhancer, settings=langfuse_settings, ) diff --git a/libs/admin-api-lib/src/admin_api_lib/information_enhancer/information_enhancer.py b/libs/admin-api-lib/src/admin_api_lib/information_enhancer/information_enhancer.py index ab1a251c..59714c8a 100644 --- a/libs/admin-api-lib/src/admin_api_lib/information_enhancer/information_enhancer.py +++ b/libs/admin-api-lib/src/admin_api_lib/information_enhancer/information_enhancer.py @@ -6,13 +6,13 @@ from langchain_core.documents import Document from langchain_core.runnables import RunnableConfig -from rag_core_lib.chains.async_chain import AsyncChain +from rag_core_lib.runnables.async_runnable import AsyncRunnable RetrieverInput = list[Document] RetrieverOutput = list[Document] -class InformationEnhancer(AsyncChain[RetrieverInput, RetrieverOutput], ABC): +class InformationEnhancer(AsyncRunnable[RetrieverInput, RetrieverOutput], ABC): """The base class for an information enhancer.""" @abstractmethod diff --git a/libs/admin-api-lib/src/admin_api_lib/summarizer/summarizer.py b/libs/admin-api-lib/src/admin_api_lib/summarizer/summarizer.py index 0a25c042..dfeb8434 100644 --- a/libs/admin-api-lib/src/admin_api_lib/summarizer/summarizer.py +++ b/libs/admin-api-lib/src/admin_api_lib/summarizer/summarizer.py @@ -5,13 +5,13 @@ from langchain_core.runnables import RunnableConfig -from rag_core_lib.chains.async_chain import AsyncChain +from rag_core_lib.runnables.async_runnable import AsyncRunnable SummarizerInput = str SummarizerOutput = str -class Summarizer(AsyncChain[SummarizerInput, SummarizerOutput], ABC): +class Summarizer(AsyncRunnable[SummarizerInput, SummarizerOutput], ABC): """Baseclass for summarizers.""" @abstractmethod diff --git a/libs/rag-core-api/src/rag_core_api/dependency_container.py b/libs/rag-core-api/src/rag_core_api/dependency_container.py index 22fa36b9..57cff6e3 100644 --- a/libs/rag-core-api/src/rag_core_api/dependency_container.py +++ b/libs/rag-core-api/src/rag_core_api/dependency_container.py @@ -64,7 +64,7 @@ from rag_core_lib.impl.settings.ollama_llm_settings import OllamaSettings from rag_core_lib.impl.settings.rag_class_types_settings import RAGClassTypeSettings from rag_core_lib.impl.settings.stackit_vllm_settings import StackitVllmSettings -from rag_core_lib.impl.tracers.langfuse_traced_chain import LangfuseTracedGraph +from rag_core_lib.impl.tracers.langfuse_traced_runnable import LangfuseTracedRunnable from rag_core_lib.impl.utils.async_threadsafe_semaphore import AsyncThreadsafeSemaphore @@ -218,7 +218,7 @@ class DependencyContainer(DeclarativeContainer): # wrap graph in tracer traced_chat_graph = Singleton( - LangfuseTracedGraph, + LangfuseTracedRunnable, inner_chain=chat_graph, settings=langfuse_settings, ) diff --git a/libs/rag-core-api/src/rag_core_api/graph/graph_base.py b/libs/rag-core-api/src/rag_core_api/graph/graph_base.py index 238cd3d1..19b86914 100644 --- a/libs/rag-core-api/src/rag_core_api/graph/graph_base.py +++ b/libs/rag-core-api/src/rag_core_api/graph/graph_base.py @@ -7,10 +7,10 @@ from langchain_core.runnables.utils import Input, Output from langgraph.graph import StateGraph -from rag_core_lib.chains.async_chain import AsyncChain +from rag_core_lib.runnables.async_runnable import AsyncRunnable -class GraphBase(AsyncChain[Input, Output], ABC): +class GraphBase(AsyncRunnable[Input, Output], ABC): """ Base class for a langgraph graph. diff --git a/libs/rag-core-api/src/rag_core_api/impl/answer_generation_chains/answer_generation_chain.py b/libs/rag-core-api/src/rag_core_api/impl/answer_generation_chains/answer_generation_chain.py index b63cce0e..9bd43383 100644 --- a/libs/rag-core-api/src/rag_core_api/impl/answer_generation_chains/answer_generation_chain.py +++ b/libs/rag-core-api/src/rag_core_api/impl/answer_generation_chains/answer_generation_chain.py @@ -7,14 +7,14 @@ from langchain_core.output_parsers import StrOutputParser from rag_core_api.impl.graph.graph_state.graph_state import AnswerGraphState -from rag_core_lib.chains.async_chain import AsyncChain +from rag_core_lib.runnables.async_runnable import AsyncRunnable from rag_core_lib.impl.langfuse_manager.langfuse_manager import LangfuseManager RunnableInput = AnswerGraphState RunnableOutput = str -class AnswerGenerationChain(AsyncChain[RunnableInput, RunnableOutput]): +class AnswerGenerationChain(AsyncRunnable[RunnableInput, RunnableOutput]): """Base class for LLM answer generation chain.""" def __init__(self, langfuse_manager: LangfuseManager): diff --git a/libs/rag-core-api/src/rag_core_api/impl/answer_generation_chains/rephrasing_chain.py b/libs/rag-core-api/src/rag_core_api/impl/answer_generation_chains/rephrasing_chain.py index 69d84c9c..3f62fe78 100644 --- a/libs/rag-core-api/src/rag_core_api/impl/answer_generation_chains/rephrasing_chain.py +++ b/libs/rag-core-api/src/rag_core_api/impl/answer_generation_chains/rephrasing_chain.py @@ -6,14 +6,14 @@ from langchain_core.runnables import Runnable, RunnableConfig from rag_core_api.impl.graph.graph_state.graph_state import AnswerGraphState -from rag_core_lib.chains.async_chain import AsyncChain +from rag_core_lib.runnables.async_runnable import AsyncRunnable from rag_core_lib.impl.langfuse_manager.langfuse_manager import LangfuseManager RunnableInput = AnswerGraphState RunnableOutput = str -class RephrasingChain(AsyncChain[RunnableInput, RunnableOutput]): +class RephrasingChain(AsyncRunnable[RunnableInput, RunnableOutput]): """Base class for rephrasing of the input question.""" def __init__(self, langfuse_manager: LangfuseManager): diff --git a/libs/rag-core-api/src/rag_core_api/impl/api_endpoints/default_chat.py b/libs/rag-core-api/src/rag_core_api/impl/api_endpoints/default_chat.py index 68df3b9c..535de232 100644 --- a/libs/rag-core-api/src/rag_core_api/impl/api_endpoints/default_chat.py +++ b/libs/rag-core-api/src/rag_core_api/impl/api_endpoints/default_chat.py @@ -5,13 +5,13 @@ from rag_core_api.api_endpoints.chat import Chat from rag_core_api.models.chat_request import ChatRequest from rag_core_api.models.chat_response import ChatResponse -from rag_core_lib.tracers.traced_chain import TracedGraph +from rag_core_lib.tracers.traced_runnable import TracedRunnable class DefaultChat(Chat): """DefaultChat is a class that handles chat interactions using a traced graph.""" - def __init__(self, chat_graph: TracedGraph): + def __init__(self, chat_graph: TracedRunnable): """ Initialize the DefaultChat instance. diff --git a/libs/rag-core-lib/src/rag_core_lib/impl/tracers/langfuse_traced_chain.py b/libs/rag-core-lib/src/rag_core_lib/impl/tracers/langfuse_traced_runnable.py similarity index 93% rename from libs/rag-core-lib/src/rag_core_lib/impl/tracers/langfuse_traced_chain.py rename to libs/rag-core-lib/src/rag_core_lib/impl/tracers/langfuse_traced_runnable.py index 45e9616b..f0fc6bee 100644 --- a/libs/rag-core-lib/src/rag_core_lib/impl/tracers/langfuse_traced_chain.py +++ b/libs/rag-core-lib/src/rag_core_lib/impl/tracers/langfuse_traced_runnable.py @@ -6,10 +6,10 @@ from langfuse.langchain import CallbackHandler from rag_core_lib.impl.settings.langfuse_settings import LangfuseSettings -from rag_core_lib.tracers.traced_chain import TracedGraph +from rag_core_lib.tracers.traced_runnable import TracedRunnable -class LangfuseTracedGraph(TracedGraph): +class LangfuseTracedRunnable(TracedRunnable): """A class to trace the execution of a Runnable using Langfuse. This class wraps an inner Runnable and adds tracing capabilities using the Langfuse tracer. diff --git a/libs/rag-core-lib/src/rag_core_lib/chains/__init__.py b/libs/rag-core-lib/src/rag_core_lib/runnables/__init__.py similarity index 100% rename from libs/rag-core-lib/src/rag_core_lib/chains/__init__.py rename to libs/rag-core-lib/src/rag_core_lib/runnables/__init__.py diff --git a/libs/rag-core-lib/src/rag_core_lib/chains/async_chain.py b/libs/rag-core-lib/src/rag_core_lib/runnables/async_runnable.py similarity index 97% rename from libs/rag-core-lib/src/rag_core_lib/chains/async_chain.py rename to libs/rag-core-lib/src/rag_core_lib/runnables/async_runnable.py index 0b61dc77..d4f051df 100644 --- a/libs/rag-core-lib/src/rag_core_lib/chains/async_chain.py +++ b/libs/rag-core-lib/src/rag_core_lib/runnables/async_runnable.py @@ -7,7 +7,7 @@ from langchain_core.runnables.utils import Input, Output -class AsyncChain(Runnable[Input, Output], ABC): +class AsyncRunnable(Runnable[Input, Output], ABC): """Base class for asynchronous chains.""" @abstractmethod diff --git a/libs/rag-core-lib/src/rag_core_lib/tracers/traced_chain.py b/libs/rag-core-lib/src/rag_core_lib/tracers/traced_runnable.py similarity index 94% rename from libs/rag-core-lib/src/rag_core_lib/tracers/traced_chain.py rename to libs/rag-core-lib/src/rag_core_lib/tracers/traced_runnable.py index e94cbe03..c43978fd 100644 --- a/libs/rag-core-lib/src/rag_core_lib/tracers/traced_chain.py +++ b/libs/rag-core-lib/src/rag_core_lib/tracers/traced_runnable.py @@ -7,13 +7,13 @@ from langchain_core.runnables import Runnable, RunnableConfig, ensure_config from langfuse import get_client -from rag_core_lib.chains.async_chain import AsyncChain +from rag_core_lib.runnables.async_runnable import AsyncRunnable RunnableInput = Any RunnableOutput = Any -class TracedGraph(AsyncChain[RunnableInput, RunnableOutput], ABC): +class TracedRunnable(AsyncRunnable[RunnableInput, RunnableOutput], ABC): """A class to represent a traced graph in an asynchronous chain. This class is designed to wrap around an inner Runnable chain and add tracing capabilities to it. diff --git a/services/rag-backend/chat_endpoint.py b/services/rag-backend/chat_endpoint.py index bff9e3cc..2bab9a90 100644 --- a/services/rag-backend/chat_endpoint.py +++ b/services/rag-backend/chat_endpoint.py @@ -4,13 +4,13 @@ from rag_core_api.api_endpoints.chat import Chat from rag_core_api.models.chat_request import ChatRequest from rag_core_api.models.chat_response import ChatResponse -from rag_core_lib.tracers.traced_chain import TracedGraph +from rag_core_lib.tracers.traced_runnable import TracedRunnable logger = logging.getLogger(__name__) class UseCaseChat(Chat): - def __init__(self, chat_graph: TracedGraph): + def __init__(self, chat_graph: TracedRunnable): self._chat_graph = chat_graph async def achat(