diff --git a/kedro-agentic-workflows/conf/base/genai-config.yml b/kedro-agentic-workflows/conf/langfuse/genai-config.yml similarity index 75% rename from kedro-agentic-workflows/conf/base/genai-config.yml rename to kedro-agentic-workflows/conf/langfuse/genai-config.yml index 623268d3..1df75559 100644 --- a/kedro-agentic-workflows/conf/base/genai-config.yml +++ b/kedro-agentic-workflows/conf/langfuse/genai-config.yml @@ -44,20 +44,13 @@ intent_prompt_langfuse: sync_policy: local # local|remote|strict mode: langchain # langchain|sdk -# intent_prompt_opik: -# type: kedro_datasets_experimental.opik.OpikPromptDataset -# filepath: data/intent_detection/prompts/intent_prompt_opik.json -# prompt_name: "intent-classifier" -# prompt_type: "chat" -# credentials: opik_credentials - # --- Tracing --- intent_tracer_langfuse: type: kedro_datasets_experimental.langfuse.LangfuseTraceDataset credentials: langfuse_credentials - mode: langchain # langchain | openai | sdk + mode: langchain # langchain | openai | sdk | autogen -# intent_tracer_opik: -# type: kedro_datasets_experimental.opik.OpikTraceDataset -# credentials: opik_credentials -# mode: openai # langchain | openai | sdk +autogen_tracer_langfuse: + type: kedro_datasets_experimental.langfuse.LangfuseTraceDataset + credentials: langfuse_credentials + mode: autogen diff --git a/kedro-agentic-workflows/conf/opik/genai-config.yml b/kedro-agentic-workflows/conf/opik/genai-config.yml new file mode 100644 index 00000000..ba4006aa --- /dev/null +++ b/kedro-agentic-workflows/conf/opik/genai-config.yml @@ -0,0 +1,54 @@ +# --- LLMs setup --- +llm: + type: langchain.ChatOpenAIDataset + kwargs: + model: "gpt-4o" + temperature: 0.0 + credentials: openai + +llm_openai: + type: kedro_agentic_workflows.datasets.openai_model_dataset.OpenAIModelDataset + model_name: "gpt-4o" + model_settings: + temperature: 0.0 + credentials: openai + +llm_autogen: + type: kedro_agentic_workflows.datasets.autogen_model_client.OpenAIChatCompletionClientDataset + kwargs: + model: "gpt-4o" + temperature: 0.0 + credentials: openai + +# --- Prompts --- +tool_prompt: + type: kedro_datasets_experimental.langchain.LangChainPromptDataset + filepath: data/response_generation/prompts/tool.txt + template: PromptTemplate + dataset: + type: text.TextDataset + +response_prompt: + type: kedro_datasets_experimental.langchain.LangChainPromptDataset + filepath: data/response_generation/prompts/response.yml + template: ChatPromptTemplate + dataset: + type: yaml.YAMLDataset + +intent_prompt_opik: + type: kedro_datasets_experimental.opik.OpikPromptDataset + filepath: data/intent_detection/prompts/intent_prompt_opik.json + prompt_name: "intent-classifier" + prompt_type: "chat" + credentials: opik_credentials + +# --- Tracing --- +intent_tracer_opik: + type: kedro_datasets_experimental.opik.OpikTraceDataset + credentials: opik_credentials + mode: openai + +autogen_tracer_opik: + type: kedro_datasets_experimental.opik.OpikTraceDataset + credentials: opik_credentials + mode: autogen diff --git a/kedro-agentic-workflows/requirements-langfuse.txt b/kedro-agentic-workflows/requirements-langfuse.txt new file mode 100644 index 00000000..241c5250 --- /dev/null +++ b/kedro-agentic-workflows/requirements-langfuse.txt @@ -0,0 +1,12 @@ +autogen-agentchat +autogen-ext[openai] +ipython>=8.10 +jupyterlab>=3.0 +notebook +kedro>=1.2.0 +kedro-datasets[pandas-sqltabledataset,pandas-sqlquerydataset,yaml-yamldataset,langchain-chatopenaidataset,langfuse,langfuse-langfusetracedataset-autogen]~=9.0.0 +kedro-viz>=12.3.0 +langgraph~=1.0.0 +scikit-learn~=1.7.2 +questionary~=2.1.1 +openai-agents diff --git a/kedro-agentic-workflows/requirements.txt b/kedro-agentic-workflows/requirements-opik.txt similarity index 78% rename from kedro-agentic-workflows/requirements.txt rename to kedro-agentic-workflows/requirements-opik.txt index 15dd5986..112cf998 100644 --- a/kedro-agentic-workflows/requirements.txt +++ b/kedro-agentic-workflows/requirements-opik.txt @@ -4,7 +4,7 @@ ipython>=8.10 jupyterlab>=3.0 notebook kedro>=1.2.0 -kedro-datasets[pandas-sqltabledataset,pandas-sqlquerydataset,yaml-yamldataset,opik,langchain-chatopenaidataset, langfuse]~=9.0.0 +kedro-datasets[pandas-sqltabledataset,pandas-sqlquerydataset,yaml-yamldataset,langchain-chatopenaidataset,opik]~=9.0.0 kedro-viz>=12.3.0 langgraph~=1.0.0 scikit-learn~=1.7.2 diff --git a/kedro-agentic-workflows/src/kedro_agentic_workflows/pipelines/response_generation_autogen/nodes.py b/kedro-agentic-workflows/src/kedro_agentic_workflows/pipelines/response_generation_autogen/nodes.py index f866e9f5..614b7645 100755 --- a/kedro-agentic-workflows/src/kedro_agentic_workflows/pipelines/response_generation_autogen/nodes.py +++ b/kedro-agentic-workflows/src/kedro_agentic_workflows/pipelines/response_generation_autogen/nodes.py @@ -16,6 +16,7 @@ def generate_response( intent_detection_result: dict, user_context: dict, session_config: dict, + tracer, ) -> dict: """ Run the ResponseGenerationAgent to produce a final answer. @@ -30,17 +31,37 @@ def generate_response( result = {"messages": [AIMessage(content=message)]} else: - agent = ResponseGenerationAgentAutogen(context=response_generation_context) - agent.compile() + # Wrap agent execution in a span for tracing + with tracer.start_as_current_span("response_generation") as span: + # Log input context to the span + span.set_attribute("intent", intent_detection_result["intent"]) + span.set_attribute( + "intent_reason", intent_detection_result.get("reason", "") + ) + span.set_attribute( + "user_id", + user_context.get("profile", {}).get("user_id", "unknown"), + ) - context = { - "messages": [], - "intent": intent_detection_result["intent"], - "intent_generator_summary": intent_detection_result["reason"], - "user_context": user_context, - } + agent = ResponseGenerationAgentAutogen(context=response_generation_context) + agent.compile() - result = agent.invoke(context, session_config) + context = { + "messages": [], + "intent": intent_detection_result["intent"], + "intent_generator_summary": intent_detection_result["reason"], + "user_context": user_context, + } + + result = agent.invoke(context, session_config) + + # Log output to the span + if result.get("messages"): + span.set_attribute( + "response", result["messages"][-1].content[:500] + ) # Truncate for safety + span.set_attribute("claim_created", result.get("claim_created", False)) + span.set_attribute("escalated", result.get("escalated", False)) for m in result["messages"]: try: diff --git a/kedro-agentic-workflows/src/kedro_agentic_workflows/pipelines/response_generation_autogen/pipeline.py b/kedro-agentic-workflows/src/kedro_agentic_workflows/pipelines/response_generation_autogen/pipeline.py index e7615c20..32ca108c 100644 --- a/kedro-agentic-workflows/src/kedro_agentic_workflows/pipelines/response_generation_autogen/pipeline.py +++ b/kedro-agentic-workflows/src/kedro_agentic_workflows/pipelines/response_generation_autogen/pipeline.py @@ -1,9 +1,6 @@ from kedro.pipeline import Pipeline, node, pipeline, llm_context_node, tool -from .nodes import ( - generate_response, - log_response_and_end_session, -) +from .nodes import generate_response, log_response_and_end_session from .tools import build_lookup_docs, build_get_user_claims, build_create_claim @@ -23,11 +20,11 @@ def create_pipeline(**kwargs) -> Pipeline: ), node( func=generate_response, - inputs=[ - "response_generation_context", + inputs=["response_generation_context", "intent_detection_result", "user_context", "session_config", + "autogen_tracer_langfuse" ], outputs="final_response", name="generate_response_node", @@ -39,4 +36,4 @@ def create_pipeline(**kwargs) -> Pipeline: name="end_session_node", ), ] - ) \ No newline at end of file + )