Langflow (tracing)

Langflow is a visual framework by DataStax for building multi-agent and RAG applications. It provides a drag-and-drop interface for composing LLM pipelines with components for models, prompts, tools, and data sources. Langflow is built on LangChain, so Respan tracing uses respan-instrumentation-langchain to capture component runs, underlying LangChain calls, tools, retrievers, and LLM generations — and gateway routing through the OpenAI-compatible Respan endpoint.

Create an account at platform.respan.ai and grab an API key.

Run npx @respan/cli setup to set up with your coding agent.

See Langflow gateway setup to route this integration through the Respan gateway.

Setup

1

Install packages

$pip install respan-tracing respan-instrumentation-langchain langflow langchain langchain-openai python-dotenv
2

Set environment variables

$export RESPAN_API_KEY="YOUR_RESPAN_API_KEY"
$export RESPAN_BASE_URL="https://api.respan.ai/api"

RESPAN_API_KEY is used to export traces to Respan. Set OPENAI_API_KEY too when your Langflow components call provider-backed models.

3

Initialize and run

For custom Langflow component code, attach the Respan LangChain callback to each LangChain runnable invocation. Reuse one callback handler so independent component runs are grouped into one trace.

1import os
2from contextlib import suppress
3
4from langchain_core.runnables import RunnableLambda
5from respan_instrumentation_langchain import add_respan_callback, get_callback_handler
6from respan_tracing import RespanTelemetry
7
8telemetry = RespanTelemetry(
9 app_name="langflow-quickstart",
10 api_key=os.environ["RESPAN_API_KEY"],
11 base_url=os.getenv("RESPAN_BASE_URL", "https://api.respan.ai/api"),
12 is_auto_instrument=False,
13 is_batching_enabled=False,
14)
15
16handler = get_callback_handler()
17
18def langflow_config(name: str):
19 return add_respan_callback(
20 {
21 "run_name": name,
22 "tags": ["respan-langchain-example", "langflow", name],
23 "metadata": {
24 "example": name,
25 "framework": "langflow",
26 "langflow_component": "RoutingComponent",
27 },
28 },
29 handler,
30 )
31
32route_department = RunnableLambda(
33 lambda input: f"{input['department']}-workspace"
34)
35get_weather = RunnableLambda(
36 lambda input: f"It is sunny in {input['city']}."
37)
38
39try:
40 route = route_department.invoke(
41 {"department": "security"},
42 config=langflow_config("langflow_route_department"),
43 )
44 weather = get_weather.invoke(
45 {"city": "Dublin"},
46 config=langflow_config("langflow_get_weather"),
47 )
48 print(f"{route}: {weather}")
49finally:
50 with suppress(Exception):
51 telemetry.flush()
4

View your trace

Open the Traces page to see your Langflow workflow with component-level operations, LLM calls, retriever spans, and tool calls.

Configuration

ParameterTypeDefaultDescription
api_keystr | NoneNoneFalls back to RESPAN_API_KEY env var.
base_urlstr | NoneNoneFalls back to RESPAN_BASE_URL env var.
instrumentationslist[]Plugin instrumentations to activate, e.g. LangChainInstrumentor().
group_langflow_root_runsboolTrue via get_callback_handler()Groups independent Langflow component root runs into one trace.
include_contentboolTrueIncludes component inputs and outputs on spans.
include_metadataboolTrueIncludes Langflow tags, metadata, and serialized runnable details.
customer_identifierstr | NoneNoneDefault customer identifier for all spans.
metadatadict | NoneNoneDefault metadata attached to all spans.
environmentstr | NoneNoneEnvironment tag, e.g. "production".

Attributes

In Respan()

Set defaults at initialization — these apply to all spans.

1from respan import Respan
2from respan_instrumentation_langchain import LangChainInstrumentor
3
4respan = Respan(
5 instrumentations=[LangChainInstrumentor()],
6 customer_identifier="user_123",
7 metadata={"service": "langflow-api", "version": "1.0.0"},
8)

With propagate_attributes

Override per-request using a context scope.

1from langflow.load import run_flow_from_json
2from respan import propagate_attributes
3
4def handle_request(user_id: str, question: str):
5 with propagate_attributes(
6 customer_identifier=user_id,
7 thread_identifier="conv_abc_123",
8 metadata={"plan": "pro"},
9 ):
10 result = run_flow_from_json(flow="flow.json", input_value=question)
11 print(result)
AttributeTypeDescription
customer_identifierstrIdentifies the end user in Respan analytics.
thread_identifierstrGroups related messages into a conversation.
metadatadictCustom key-value pairs. Merged with default metadata.

Decorators (optional)

Decorators are not required. Langflow runs are traced through LangChain callbacks. Use @workflow and @task (Python) or withWorkflow and withTask (TypeScript) when you want to group one or more flow executions inside a named application workflow.

1from respan import workflow, task
2
3@task(name="run_langflow_flow")
4def run_langflow_flow(question: str):
5 return run_flow_from_json(flow="flow.json", input_value=question)
6
7@workflow(name="langflow_request")
8def pipeline(question: str):
9 print(run_langflow_flow(question))
10
11pipeline("What is the meaning of life?")
12respan.flush()

Examples

Custom component callback grouping

Use one callback handler for the component invocation so multiple LangChain calls in the same custom component share a trace.

1from respan_instrumentation_langchain import add_respan_callback, get_callback_handler
2
3handler = get_callback_handler()
4config = add_respan_callback(
5 {
6 "run_name": "langflow_component",
7 "tags": ["langflow", "custom-component"],
8 "metadata": {
9 "framework": "langflow",
10 "langflow_component": "RoutingComponent",
11 },
12 },
13 handler,
14)
15
16result = chain.invoke({"question": "Route this request"}, config=config)

Exported flows

Exported flows can be run normally after Respan telemetry is initialized. For custom components inside the flow, pass add_respan_callback(...) when invoking LangChain runnables.

1from langflow.load import run_flow_from_json
2
3result = run_flow_from_json(
4 flow="path/to/your/flow.json",
5 input_value="Summarize this support request.",
6)
7print(result)