agento11y-langchain 0.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ SPDX-License-Identifier: Apache-2.0
2
+
3
+ See /LICENSE at repository root for full license text.
@@ -0,0 +1,104 @@
1
+ Metadata-Version: 2.4
2
+ Name: agento11y-langchain
3
+ Version: 0.10.0
4
+ Summary: LangChain callback handlers for the Grafana Agent Observability Python SDK
5
+ License: SPDX-License-Identifier: Apache-2.0
6
+
7
+ See /LICENSE at repository root for full license text.
8
+
9
+ Requires-Python: >=3.10
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: agento11y>=0.10.0
13
+ Requires-Dist: langchain-core>=0.3.0
14
+ Provides-Extra: dev
15
+ Requires-Dist: pytest>=9.0.3; extra == "dev"
16
+ Dynamic: license-file
17
+
18
+ # Sigil Python Framework Module: LangChain
19
+
20
+ `agento11y-langchain` provides callback handlers that map LangChain lifecycle events into Sigil generation recorder lifecycles.
21
+
22
+ ## Installation
23
+
24
+ ```bash
25
+ pip install agento11y agento11y-langchain
26
+ pip install langchain-openai
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ```python
32
+ from agento11y import Client
33
+ from agento11y_langchain import with_agento11y_langchain_callbacks
34
+
35
+ client = Client()
36
+ config = with_agento11y_langchain_callbacks(None, client=client, provider_resolver="auto")
37
+ ```
38
+
39
+ ## End-to-end example (invoke + stream)
40
+
41
+ ```python
42
+ from langchain_openai import ChatOpenAI
43
+ from agento11y import Client
44
+ from agento11y_langchain import Agento11yLangChainHandler, with_agento11y_langchain_callbacks
45
+
46
+ client = Client()
47
+ handler = Agento11yLangChainHandler(
48
+ client=client,
49
+ provider_resolver="auto",
50
+ agent_name="langchain-example",
51
+ agent_version="1.0.0",
52
+ )
53
+
54
+ llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
55
+
56
+ # Non-stream call -> SYNC generation mode.
57
+ result = llm.invoke(
58
+ "Summarize why retry budgets matter.",
59
+ config=with_agento11y_langchain_callbacks(None, client=client, provider_resolver="auto"),
60
+ )
61
+ print(result.content)
62
+
63
+ # Stream call -> STREAM generation mode + TTFT tracking.
64
+ for chunk in llm.stream(
65
+ "Give me three short reliability tips.",
66
+ config=with_agento11y_langchain_callbacks(None, client=client, provider_resolver="auto"),
67
+ ):
68
+ if chunk.content:
69
+ print(chunk.content, end="", flush=True)
70
+ print()
71
+
72
+ # Advanced usage: explicit handler wiring remains supported.
73
+ _ = llm.invoke("manual handler wiring", config={"callbacks": [handler]})
74
+
75
+ client.shutdown()
76
+ ```
77
+
78
+ ## Behavior
79
+
80
+ - Lifecycle mapping:
81
+ - `on_llm_start` / `on_chat_model_start` -> generation recorder
82
+ - `on_tool_start` / `on_tool_end` / `on_tool_error` -> `start_tool_execution`
83
+ - `on_chain_start` / `on_chain_end` / `on_chain_error` -> framework chain spans
84
+ - `on_retriever_start` / `on_retriever_end` / `on_retriever_error` -> framework retriever spans
85
+ - `on_llm_new_token` -> first-token timestamp for stream mode
86
+ - Mode mapping: non-stream -> `SYNC`, stream -> `STREAM`.
87
+ - Provider resolver parity:
88
+ - explicit provider metadata when available
89
+ - model-name inference (`gpt-`/`o1`/`o3`/`o4` -> `openai`, `claude-` -> `anthropic`, `gemini-` -> `gemini`)
90
+ - fallback -> `custom`
91
+ - Framework tags/metadata are always set:
92
+ - `agento11y.framework.name=langchain`
93
+ - `agento11y.framework.source=handler`
94
+ - `agento11y.framework.language=python`
95
+ - `metadata["agento11y.framework.run_id"]=<run id>`
96
+ - `metadata["agento11y.framework.thread_id"]=<thread id>` (when present in callback metadata/config)
97
+ - `metadata["agento11y.framework.parent_run_id"]` (when available)
98
+ - `metadata["agento11y.framework.component_name"]` (serialized component identity)
99
+ - `metadata["agento11y.framework.run_type"]` (`llm`, `chat`, `tool`, `chain`, `retriever`)
100
+ - `metadata["agento11y.framework.tags"]` (normalized callback tags)
101
+ - `metadata["agento11y.framework.retry_attempt"]` (when available)
102
+ - generation span attributes mirror low-cardinality framework metadata keys
103
+
104
+ Call `client.shutdown()` during teardown to flush buffered telemetry.
@@ -0,0 +1,87 @@
1
+ # Sigil Python Framework Module: LangChain
2
+
3
+ `agento11y-langchain` provides callback handlers that map LangChain lifecycle events into Sigil generation recorder lifecycles.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pip install agento11y agento11y-langchain
9
+ pip install langchain-openai
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```python
15
+ from agento11y import Client
16
+ from agento11y_langchain import with_agento11y_langchain_callbacks
17
+
18
+ client = Client()
19
+ config = with_agento11y_langchain_callbacks(None, client=client, provider_resolver="auto")
20
+ ```
21
+
22
+ ## End-to-end example (invoke + stream)
23
+
24
+ ```python
25
+ from langchain_openai import ChatOpenAI
26
+ from agento11y import Client
27
+ from agento11y_langchain import Agento11yLangChainHandler, with_agento11y_langchain_callbacks
28
+
29
+ client = Client()
30
+ handler = Agento11yLangChainHandler(
31
+ client=client,
32
+ provider_resolver="auto",
33
+ agent_name="langchain-example",
34
+ agent_version="1.0.0",
35
+ )
36
+
37
+ llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
38
+
39
+ # Non-stream call -> SYNC generation mode.
40
+ result = llm.invoke(
41
+ "Summarize why retry budgets matter.",
42
+ config=with_agento11y_langchain_callbacks(None, client=client, provider_resolver="auto"),
43
+ )
44
+ print(result.content)
45
+
46
+ # Stream call -> STREAM generation mode + TTFT tracking.
47
+ for chunk in llm.stream(
48
+ "Give me three short reliability tips.",
49
+ config=with_agento11y_langchain_callbacks(None, client=client, provider_resolver="auto"),
50
+ ):
51
+ if chunk.content:
52
+ print(chunk.content, end="", flush=True)
53
+ print()
54
+
55
+ # Advanced usage: explicit handler wiring remains supported.
56
+ _ = llm.invoke("manual handler wiring", config={"callbacks": [handler]})
57
+
58
+ client.shutdown()
59
+ ```
60
+
61
+ ## Behavior
62
+
63
+ - Lifecycle mapping:
64
+ - `on_llm_start` / `on_chat_model_start` -> generation recorder
65
+ - `on_tool_start` / `on_tool_end` / `on_tool_error` -> `start_tool_execution`
66
+ - `on_chain_start` / `on_chain_end` / `on_chain_error` -> framework chain spans
67
+ - `on_retriever_start` / `on_retriever_end` / `on_retriever_error` -> framework retriever spans
68
+ - `on_llm_new_token` -> first-token timestamp for stream mode
69
+ - Mode mapping: non-stream -> `SYNC`, stream -> `STREAM`.
70
+ - Provider resolver parity:
71
+ - explicit provider metadata when available
72
+ - model-name inference (`gpt-`/`o1`/`o3`/`o4` -> `openai`, `claude-` -> `anthropic`, `gemini-` -> `gemini`)
73
+ - fallback -> `custom`
74
+ - Framework tags/metadata are always set:
75
+ - `agento11y.framework.name=langchain`
76
+ - `agento11y.framework.source=handler`
77
+ - `agento11y.framework.language=python`
78
+ - `metadata["agento11y.framework.run_id"]=<run id>`
79
+ - `metadata["agento11y.framework.thread_id"]=<thread id>` (when present in callback metadata/config)
80
+ - `metadata["agento11y.framework.parent_run_id"]` (when available)
81
+ - `metadata["agento11y.framework.component_name"]` (serialized component identity)
82
+ - `metadata["agento11y.framework.run_type"]` (`llm`, `chat`, `tool`, `chain`, `retriever`)
83
+ - `metadata["agento11y.framework.tags"]` (normalized callback tags)
84
+ - `metadata["agento11y.framework.retry_attempt"]` (when available)
85
+ - generation span attributes mirror low-cardinality framework metadata keys
86
+
87
+ Call `client.shutdown()` during teardown to flush buffered telemetry.
@@ -0,0 +1,51 @@
1
+ """Public exports for Sigil LangChain callback handlers."""
2
+
3
+ from typing import Any
4
+
5
+ from agento11y import Client
6
+
7
+ from .handler import Agento11yAsyncLangChainHandler, Agento11yLangChainHandler
8
+
9
+
10
+ def create_agento11y_langchain_handler(
11
+ *,
12
+ client: Client,
13
+ async_handler: bool = False,
14
+ **handler_kwargs: Any,
15
+ ) -> Agento11yLangChainHandler | Agento11yAsyncLangChainHandler:
16
+ """Create a LangChain Sigil callback handler for sync or async flows."""
17
+ if async_handler:
18
+ return Agento11yAsyncLangChainHandler(client=client, **handler_kwargs)
19
+ return Agento11yLangChainHandler(client=client, **handler_kwargs)
20
+
21
+
22
+ def with_agento11y_langchain_callbacks(
23
+ config: dict[str, Any] | None,
24
+ *,
25
+ client: Client,
26
+ async_handler: bool = False,
27
+ **handler_kwargs: Any,
28
+ ) -> dict[str, Any]:
29
+ """Append a Sigil callback handler to a LangChain runnable config."""
30
+ merged = dict(config or {})
31
+ existing = merged.get("callbacks")
32
+ if isinstance(existing, list):
33
+ callbacks = list(existing)
34
+ elif existing is None:
35
+ callbacks = []
36
+ else:
37
+ callbacks = [existing]
38
+ if not any(isinstance(item, (Agento11yLangChainHandler, Agento11yAsyncLangChainHandler)) for item in callbacks):
39
+ callbacks.append(
40
+ create_agento11y_langchain_handler(client=client, async_handler=async_handler, **handler_kwargs)
41
+ )
42
+ merged["callbacks"] = callbacks
43
+ return merged
44
+
45
+
46
+ __all__ = [
47
+ "Agento11yLangChainHandler",
48
+ "Agento11yAsyncLangChainHandler",
49
+ "create_agento11y_langchain_handler",
50
+ "with_agento11y_langchain_callbacks",
51
+ ]
@@ -0,0 +1,349 @@
1
+ """LangChain callback handlers for Sigil generation recording."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+ from uuid import UUID
7
+
8
+ from agento11y import Client
9
+ from agento11y.framework_handler import Agento11yFrameworkHandlerBase, ProviderResolver
10
+
11
+ try:
12
+ from langchain_core.callbacks import AsyncCallbackHandler, BaseCallbackHandler
13
+ except ModuleNotFoundError: # pragma: no cover - handled by package dependency in normal installs
14
+
15
+ class BaseCallbackHandler: # type: ignore[no-redef]
16
+ """Fallback base class when langchain-core is unavailable."""
17
+
18
+ class AsyncCallbackHandler: # type: ignore[no-redef]
19
+ """Fallback async base class when langchain-core is unavailable."""
20
+
21
+
22
+ _framework_name = "langchain"
23
+ _framework_source = "handler"
24
+ _framework_language = "python"
25
+ _framework_instrumentation_name = "github.com/grafana/sigil/sdks/python-frameworks/langchain"
26
+
27
+
28
+ def _merge_callback_kwargs(
29
+ kwargs: dict[str, Any],
30
+ *,
31
+ tags: list[str] | None = None,
32
+ metadata: dict[str, Any] | None = None,
33
+ run_name: str | None = None,
34
+ ) -> dict[str, Any]:
35
+ callback_kwargs = dict(kwargs)
36
+ if tags is not None:
37
+ callback_kwargs["tags"] = tags
38
+ if metadata is not None:
39
+ callback_kwargs["metadata"] = metadata
40
+ if run_name is not None and run_name.strip() != "":
41
+ callback_kwargs["run_name"] = run_name
42
+ return callback_kwargs
43
+
44
+
45
+ class _Agento11yLangChainBase(Agento11yFrameworkHandlerBase):
46
+ def __init__(
47
+ self,
48
+ *,
49
+ client: Client,
50
+ agent_name: str = "",
51
+ agent_version: str = "",
52
+ provider_resolver: ProviderResolver = "auto",
53
+ provider: str = "",
54
+ capture_inputs: bool = True,
55
+ capture_outputs: bool = True,
56
+ capture_workflow_steps: bool = False,
57
+ conversation_title: str = "",
58
+ extra_tags: dict[str, str] | None = None,
59
+ extra_metadata: dict[str, Any] | None = None,
60
+ ) -> None:
61
+ super().__init__(
62
+ client=client,
63
+ framework_name=_framework_name,
64
+ framework_source=_framework_source,
65
+ framework_language=_framework_language,
66
+ framework_instrumentation_name=_framework_instrumentation_name,
67
+ agent_name=agent_name,
68
+ agent_version=agent_version,
69
+ provider_resolver=provider_resolver,
70
+ provider=provider,
71
+ capture_inputs=capture_inputs,
72
+ capture_outputs=capture_outputs,
73
+ capture_workflow_steps=capture_workflow_steps,
74
+ conversation_title=conversation_title,
75
+ extra_tags=extra_tags,
76
+ extra_metadata=extra_metadata,
77
+ )
78
+
79
+
80
+ class Agento11yLangChainHandler(_Agento11yLangChainBase, BaseCallbackHandler):
81
+ """Sync LangChain callback handler that records Sigil generations."""
82
+
83
+ def on_llm_start(
84
+ self,
85
+ serialized: dict[str, Any] | None,
86
+ prompts: list[str],
87
+ *,
88
+ run_id: UUID,
89
+ parent_run_id: UUID | None = None,
90
+ tags: list[str] | None = None,
91
+ metadata: dict[str, Any] | None = None,
92
+ invocation_params: dict[str, Any] | None = None,
93
+ run_name: str | None = None,
94
+ **kwargs: Any,
95
+ ) -> None:
96
+ self._on_llm_start(
97
+ serialized=serialized,
98
+ prompts=prompts,
99
+ run_id=run_id,
100
+ parent_run_id=parent_run_id,
101
+ invocation_params=invocation_params,
102
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
103
+ )
104
+
105
+ def on_chat_model_start(
106
+ self,
107
+ serialized: dict[str, Any] | None,
108
+ messages: list[list[Any]],
109
+ *,
110
+ run_id: UUID,
111
+ parent_run_id: UUID | None = None,
112
+ tags: list[str] | None = None,
113
+ metadata: dict[str, Any] | None = None,
114
+ invocation_params: dict[str, Any] | None = None,
115
+ run_name: str | None = None,
116
+ **kwargs: Any,
117
+ ) -> None:
118
+ self._on_chat_model_start(
119
+ serialized=serialized,
120
+ messages=messages,
121
+ run_id=run_id,
122
+ parent_run_id=parent_run_id,
123
+ invocation_params=invocation_params,
124
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
125
+ )
126
+
127
+ def on_llm_new_token(self, token: str, *, run_id: UUID, **_kwargs: Any) -> None:
128
+ self._on_llm_new_token(token=token, run_id=run_id)
129
+
130
+ def on_llm_end(self, response: Any, *, run_id: UUID, **_kwargs: Any) -> None:
131
+ self._on_llm_end(response=response, run_id=run_id)
132
+
133
+ def on_llm_error(self, error: BaseException, *, run_id: UUID, **_kwargs: Any) -> None:
134
+ self._on_llm_error(error=error, run_id=run_id)
135
+
136
+ def on_tool_start(
137
+ self,
138
+ serialized: dict[str, Any] | None,
139
+ input_str: str,
140
+ *,
141
+ run_id: UUID,
142
+ parent_run_id: UUID | None = None,
143
+ tags: list[str] | None = None,
144
+ metadata: dict[str, Any] | None = None,
145
+ run_name: str | None = None,
146
+ **kwargs: Any,
147
+ ) -> None:
148
+ self._on_tool_start(
149
+ serialized=serialized,
150
+ input_str=input_str,
151
+ run_id=run_id,
152
+ parent_run_id=parent_run_id,
153
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
154
+ )
155
+
156
+ def on_tool_end(self, output: Any, *, run_id: UUID, **_kwargs: Any) -> None:
157
+ self._on_tool_end(output=output, run_id=run_id)
158
+
159
+ def on_tool_error(self, error: BaseException, *, run_id: UUID, **_kwargs: Any) -> None:
160
+ self._on_tool_error(error=error, run_id=run_id)
161
+
162
+ def on_chain_start(
163
+ self,
164
+ serialized: dict[str, Any] | None,
165
+ inputs: dict[str, Any] | None,
166
+ *,
167
+ run_id: UUID,
168
+ parent_run_id: UUID | None = None,
169
+ tags: list[str] | None = None,
170
+ metadata: dict[str, Any] | None = None,
171
+ run_type: str | None = None,
172
+ run_name: str | None = None,
173
+ **kwargs: Any,
174
+ ) -> None:
175
+ self._on_chain_start(
176
+ serialized=serialized,
177
+ run_id=run_id,
178
+ parent_run_id=parent_run_id,
179
+ run_type=run_type or "chain",
180
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
181
+ inputs=inputs,
182
+ )
183
+
184
+ def on_chain_end(self, outputs: dict[str, Any] | None, *, run_id: UUID, **_kwargs: Any) -> None:
185
+ self._on_chain_end(run_id=run_id, outputs=outputs)
186
+
187
+ def on_chain_error(self, error: BaseException, *, run_id: UUID, **_kwargs: Any) -> None:
188
+ self._on_chain_error(error=error, run_id=run_id)
189
+
190
+ def on_retriever_start(
191
+ self,
192
+ serialized: dict[str, Any] | None,
193
+ _query: str,
194
+ *,
195
+ run_id: UUID,
196
+ parent_run_id: UUID | None = None,
197
+ tags: list[str] | None = None,
198
+ metadata: dict[str, Any] | None = None,
199
+ run_name: str | None = None,
200
+ **kwargs: Any,
201
+ ) -> None:
202
+ self._on_retriever_start(
203
+ serialized=serialized,
204
+ run_id=run_id,
205
+ parent_run_id=parent_run_id,
206
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
207
+ )
208
+
209
+ def on_retriever_end(self, _documents: list[Any], *, run_id: UUID, **_kwargs: Any) -> None:
210
+ self._on_retriever_end(run_id=run_id)
211
+
212
+ def on_retriever_error(self, error: BaseException, *, run_id: UUID, **_kwargs: Any) -> None:
213
+ self._on_retriever_error(error=error, run_id=run_id)
214
+
215
+
216
+ class Agento11yAsyncLangChainHandler(_Agento11yLangChainBase, AsyncCallbackHandler):
217
+ """Async LangChain callback handler that records Sigil generations."""
218
+
219
+ async def on_llm_start(
220
+ self,
221
+ serialized: dict[str, Any] | None,
222
+ prompts: list[str],
223
+ *,
224
+ run_id: UUID,
225
+ parent_run_id: UUID | None = None,
226
+ tags: list[str] | None = None,
227
+ metadata: dict[str, Any] | None = None,
228
+ invocation_params: dict[str, Any] | None = None,
229
+ run_name: str | None = None,
230
+ **kwargs: Any,
231
+ ) -> None:
232
+ self._on_llm_start(
233
+ serialized=serialized,
234
+ prompts=prompts,
235
+ run_id=run_id,
236
+ parent_run_id=parent_run_id,
237
+ invocation_params=invocation_params,
238
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
239
+ )
240
+
241
+ async def on_chat_model_start(
242
+ self,
243
+ serialized: dict[str, Any] | None,
244
+ messages: list[list[Any]],
245
+ *,
246
+ run_id: UUID,
247
+ parent_run_id: UUID | None = None,
248
+ tags: list[str] | None = None,
249
+ metadata: dict[str, Any] | None = None,
250
+ invocation_params: dict[str, Any] | None = None,
251
+ run_name: str | None = None,
252
+ **kwargs: Any,
253
+ ) -> None:
254
+ self._on_chat_model_start(
255
+ serialized=serialized,
256
+ messages=messages,
257
+ run_id=run_id,
258
+ parent_run_id=parent_run_id,
259
+ invocation_params=invocation_params,
260
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
261
+ )
262
+
263
+ async def on_llm_new_token(self, token: str, *, run_id: UUID, **_kwargs: Any) -> None:
264
+ self._on_llm_new_token(token=token, run_id=run_id)
265
+
266
+ async def on_llm_end(self, response: Any, *, run_id: UUID, **_kwargs: Any) -> None:
267
+ self._on_llm_end(response=response, run_id=run_id)
268
+
269
+ async def on_llm_error(self, error: BaseException, *, run_id: UUID, **_kwargs: Any) -> None:
270
+ self._on_llm_error(error=error, run_id=run_id)
271
+
272
+ async def on_tool_start(
273
+ self,
274
+ serialized: dict[str, Any] | None,
275
+ input_str: str,
276
+ *,
277
+ run_id: UUID,
278
+ parent_run_id: UUID | None = None,
279
+ tags: list[str] | None = None,
280
+ metadata: dict[str, Any] | None = None,
281
+ run_name: str | None = None,
282
+ **kwargs: Any,
283
+ ) -> None:
284
+ self._on_tool_start(
285
+ serialized=serialized,
286
+ input_str=input_str,
287
+ run_id=run_id,
288
+ parent_run_id=parent_run_id,
289
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
290
+ )
291
+
292
+ async def on_tool_end(self, output: Any, *, run_id: UUID, **_kwargs: Any) -> None:
293
+ self._on_tool_end(output=output, run_id=run_id)
294
+
295
+ async def on_tool_error(self, error: BaseException, *, run_id: UUID, **_kwargs: Any) -> None:
296
+ self._on_tool_error(error=error, run_id=run_id)
297
+
298
+ async def on_chain_start(
299
+ self,
300
+ serialized: dict[str, Any] | None,
301
+ inputs: dict[str, Any] | None,
302
+ *,
303
+ run_id: UUID,
304
+ parent_run_id: UUID | None = None,
305
+ tags: list[str] | None = None,
306
+ metadata: dict[str, Any] | None = None,
307
+ run_type: str | None = None,
308
+ run_name: str | None = None,
309
+ **kwargs: Any,
310
+ ) -> None:
311
+ self._on_chain_start(
312
+ serialized=serialized,
313
+ run_id=run_id,
314
+ parent_run_id=parent_run_id,
315
+ run_type=run_type or "chain",
316
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
317
+ inputs=inputs,
318
+ )
319
+
320
+ async def on_chain_end(self, outputs: dict[str, Any] | None, *, run_id: UUID, **_kwargs: Any) -> None:
321
+ self._on_chain_end(run_id=run_id, outputs=outputs)
322
+
323
+ async def on_chain_error(self, error: BaseException, *, run_id: UUID, **_kwargs: Any) -> None:
324
+ self._on_chain_error(error=error, run_id=run_id)
325
+
326
+ async def on_retriever_start(
327
+ self,
328
+ serialized: dict[str, Any] | None,
329
+ _query: str,
330
+ *,
331
+ run_id: UUID,
332
+ parent_run_id: UUID | None = None,
333
+ tags: list[str] | None = None,
334
+ metadata: dict[str, Any] | None = None,
335
+ run_name: str | None = None,
336
+ **kwargs: Any,
337
+ ) -> None:
338
+ self._on_retriever_start(
339
+ serialized=serialized,
340
+ run_id=run_id,
341
+ parent_run_id=parent_run_id,
342
+ callback_kwargs=_merge_callback_kwargs(kwargs, tags=tags, metadata=metadata, run_name=run_name),
343
+ )
344
+
345
+ async def on_retriever_end(self, _documents: list[Any], *, run_id: UUID, **_kwargs: Any) -> None:
346
+ self._on_retriever_end(run_id=run_id)
347
+
348
+ async def on_retriever_error(self, error: BaseException, *, run_id: UUID, **_kwargs: Any) -> None:
349
+ self._on_retriever_error(error=error, run_id=run_id)