uipath-langchain 0.0.90__py3-none-any.whl → 0.0.92__py3-none-any.whl

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.

Potentially problematic release.


This version of uipath-langchain might be problematic. Click here for more details.

@@ -15,7 +15,7 @@ from uipath._cli._runtime._contracts import (
15
15
  UiPathRuntimeResult,
16
16
  )
17
17
 
18
- from ..._utils import _instrument_traceable
18
+ from ..._utils import _instrument_traceable_attributes
19
19
  from ...tracers import AsyncUiPathTracer
20
20
  from ._context import LangGraphRuntimeContext
21
21
  from ._exception import LangGraphRuntimeError
@@ -45,7 +45,7 @@ class LangGraphRuntime(UiPathBaseRuntime):
45
45
  Raises:
46
46
  LangGraphRuntimeError: If execution fails
47
47
  """
48
- _instrument_traceable()
48
+ _instrument_traceable_attributes()
49
49
 
50
50
  await self.validate()
51
51
 
@@ -1,4 +1,4 @@
1
- from ..tracers._instrument_traceable import _instrument_traceable
1
+ from ..tracers._instrument_traceable import _instrument_traceable_attributes
2
2
  from ._request_mixin import UiPathRequestMixin
3
3
 
4
- __all__ = ["UiPathRequestMixin", "_instrument_traceable"]
4
+ __all__ = ["UiPathRequestMixin", "_instrument_traceable_attributes"]
@@ -1,5 +1,9 @@
1
- from ._instrument_traceable import _instrument_traceable
1
+ from ._instrument_traceable import _instrument_traceable_attributes
2
2
  from .AsyncUiPathTracer import AsyncUiPathTracer
3
3
  from .UiPathTracer import UiPathTracer
4
4
 
5
- __all__ = ["AsyncUiPathTracer", "UiPathTracer", "_instrument_traceable"]
5
+ __all__ = [
6
+ "AsyncUiPathTracer",
7
+ "UiPathTracer",
8
+ "_instrument_traceable_attributes",
9
+ ]
@@ -4,9 +4,10 @@ import inspect
4
4
  import logging
5
5
  import sys
6
6
  import uuid
7
- from typing import Any, Dict, List, Literal, Optional
7
+ from typing import Any, Callable, Dict, List, Literal, Optional
8
8
 
9
9
  from langchain_core.callbacks import dispatch_custom_event
10
+ from uipath.tracing import TracingManager
10
11
 
11
12
  from ._events import CustomTraceEvents, FunctionCallEventData
12
13
 
@@ -82,26 +83,228 @@ def format_args_for_trace(
82
83
  return {"args": args, "kwargs": kwargs}
83
84
 
84
85
 
85
- # Create patched version of traceable
86
- def patched_traceable(*decorator_args, **decorator_kwargs):
87
- # Handle the case when @traceable is used directly as decorator without arguments
88
- if (
89
- len(decorator_args) == 1
90
- and callable(decorator_args[0])
91
- and not decorator_kwargs
92
- ):
93
- func = decorator_args[0]
94
- return _create_appropriate_wrapper(func, original_traceable(func), {})
95
-
96
- # Handle the case when @traceable(args) is used with parameters
97
- original_decorated = original_traceable(*decorator_args, **decorator_kwargs)
86
+ def _create_traced_wrapper(
87
+ func: Callable[..., Any],
88
+ wrapper_func: Optional[Callable[..., Any]] = None,
89
+ func_name: Optional[str] = None,
90
+ run_type: Optional[str] = None,
91
+ span_type: Optional[str] = None,
92
+ tags: Optional[List[str]] = None,
93
+ metadata: Optional[Dict[str, Any]] = None,
94
+ input_processor: Optional[Callable[..., Any]] = None,
95
+ output_processor: Optional[Callable[..., Any]] = None,
96
+ ):
97
+ """Create a traced wrapper based on function type."""
98
+ # Use function name if not provided
99
+ actual_func_name = func_name or func.__name__
100
+ # Function to actually call (the wrapped function or original)
101
+ target_func = wrapper_func or func
102
+ # Ensure we have metadata
103
+ actual_metadata = metadata or {}
104
+
105
+ # Define all wrapper functions
106
+
107
+ @functools.wraps(target_func)
108
+ async def async_gen_wrapper(*args, **kwargs):
109
+ try:
110
+ call_uuid = str(uuid.uuid4())
111
+
112
+ # Get inputs and process them if needed
113
+ inputs = format_args_for_trace(inspect.signature(func), *args, **kwargs)
114
+ if input_processor is not None:
115
+ inputs = input_processor(inputs)
116
+
117
+ # Add span_type to metadata if provided
118
+ if span_type:
119
+ actual_metadata["span_type"] = (
120
+ span_type or "function_call_generator_async"
121
+ )
98
122
 
99
- def uipath_trace_decorator(func):
100
- # Apply the original decorator with its arguments
101
- wrapped_func = original_decorated(func)
102
- return _create_appropriate_wrapper(func, wrapped_func, decorator_kwargs)
123
+ dispatch_trace_event(
124
+ actual_func_name,
125
+ inputs,
126
+ "call",
127
+ call_uuid,
128
+ run_type=run_type, # type: ignore
129
+ tags=tags,
130
+ metadata=actual_metadata,
131
+ )
132
+
133
+ outputs = []
134
+ async_gen = target_func(*args, **kwargs)
135
+ async for item in async_gen:
136
+ outputs.append(item)
137
+ yield item
138
+
139
+ # Process output if needed
140
+ output_to_record = outputs
141
+ if output_processor is not None:
142
+ output_to_record = output_processor(outputs)
143
+
144
+ dispatch_trace_event(
145
+ actual_func_name,
146
+ inputs,
147
+ "completion",
148
+ call_uuid,
149
+ result=output_to_record,
150
+ )
151
+ except Exception as e:
152
+ dispatch_trace_event(
153
+ actual_func_name, inputs, "completion", call_uuid, exception=e
154
+ )
155
+ raise
156
+
157
+ @functools.wraps(target_func)
158
+ def gen_wrapper(*args, **kwargs):
159
+ try:
160
+ call_uuid = str(uuid.uuid4())
161
+
162
+ # Get inputs and process them if needed
163
+ inputs = format_args_for_trace(inspect.signature(func), *args, **kwargs)
164
+ if input_processor is not None:
165
+ inputs = input_processor(inputs)
166
+
167
+ # Add span_type to metadata if provided
168
+ if span_type:
169
+ actual_metadata["span_type"] = (
170
+ span_type or "function_call_generator_sync"
171
+ )
103
172
 
104
- return uipath_trace_decorator
173
+ dispatch_trace_event(
174
+ actual_func_name,
175
+ inputs,
176
+ "call",
177
+ call_uuid,
178
+ run_type=run_type, # type: ignore
179
+ tags=tags,
180
+ metadata=actual_metadata,
181
+ )
182
+
183
+ outputs = []
184
+ gen = target_func(*args, **kwargs)
185
+ for item in gen:
186
+ outputs.append(item)
187
+ yield item
188
+
189
+ # Process output if needed
190
+ output_to_record = outputs
191
+ if output_processor is not None:
192
+ output_to_record = output_processor(outputs)
193
+
194
+ dispatch_trace_event(
195
+ actual_func_name,
196
+ inputs,
197
+ "completion",
198
+ call_uuid,
199
+ result=output_to_record,
200
+ )
201
+ except Exception as e:
202
+ dispatch_trace_event(
203
+ actual_func_name, inputs, "completion", call_uuid, exception=e
204
+ )
205
+ raise
206
+
207
+ @functools.wraps(target_func)
208
+ async def async_wrapper(*args, **kwargs):
209
+ try:
210
+ call_uuid = str(uuid.uuid4())
211
+
212
+ # Get inputs and process them if needed
213
+ inputs = format_args_for_trace(inspect.signature(func), *args, **kwargs)
214
+ if input_processor is not None:
215
+ inputs = input_processor(inputs)
216
+
217
+ # Add span_type to metadata if provided
218
+ if span_type:
219
+ actual_metadata["span_type"] = span_type or "function_call_async"
220
+
221
+ dispatch_trace_event(
222
+ actual_func_name,
223
+ inputs,
224
+ "call",
225
+ call_uuid,
226
+ run_type=run_type, # type: ignore
227
+ tags=tags,
228
+ metadata=actual_metadata,
229
+ )
230
+
231
+ result = await target_func(*args, **kwargs)
232
+
233
+ # Process output if needed
234
+ output_to_record = result
235
+ if output_processor is not None:
236
+ output_to_record = output_processor(result)
237
+
238
+ dispatch_trace_event(
239
+ actual_func_name,
240
+ inputs,
241
+ "completion",
242
+ call_uuid,
243
+ result=output_to_record,
244
+ )
245
+
246
+ return result
247
+ except Exception as e:
248
+ dispatch_trace_event(
249
+ actual_func_name, inputs, "completion", call_uuid, exception=e
250
+ )
251
+ raise
252
+
253
+ @functools.wraps(target_func)
254
+ def sync_wrapper(*args, **kwargs):
255
+ try:
256
+ call_uuid = str(uuid.uuid4())
257
+
258
+ # Get inputs and process them if needed
259
+ inputs = format_args_for_trace(inspect.signature(func), *args, **kwargs)
260
+ if input_processor is not None:
261
+ inputs = input_processor(inputs)
262
+
263
+ # Add span_type to metadata if provided
264
+ if span_type:
265
+ actual_metadata["span_type"] = span_type or "function_call_sync"
266
+
267
+ dispatch_trace_event(
268
+ actual_func_name,
269
+ inputs,
270
+ "call",
271
+ call_uuid,
272
+ run_type=run_type, # type: ignore
273
+ tags=tags,
274
+ metadata=actual_metadata,
275
+ )
276
+
277
+ result = target_func(*args, **kwargs)
278
+
279
+ # Process output if needed
280
+ output_to_record = result
281
+ if output_processor is not None:
282
+ output_to_record = output_processor(result)
283
+
284
+ dispatch_trace_event(
285
+ actual_func_name,
286
+ inputs,
287
+ "completion",
288
+ call_uuid,
289
+ result=output_to_record,
290
+ )
291
+
292
+ return result
293
+ except Exception as e:
294
+ dispatch_trace_event(
295
+ actual_func_name, inputs, "completion", call_uuid, exception=e
296
+ )
297
+ raise
298
+
299
+ # Return the appropriate wrapper based on the function type
300
+ if inspect.isasyncgenfunction(target_func):
301
+ return async_gen_wrapper
302
+ elif inspect.isgeneratorfunction(target_func):
303
+ return gen_wrapper
304
+ elif inspect.iscoroutinefunction(target_func):
305
+ return async_wrapper
306
+ else:
307
+ return sync_wrapper
105
308
 
106
309
 
107
310
  def _create_appropriate_wrapper(
@@ -115,154 +318,73 @@ def _create_appropriate_wrapper(
115
318
  metadata = decorator_kwargs.get("metadata", None)
116
319
  run_type = decorator_kwargs.get("run_type", None)
117
320
 
118
- # Async generator function
119
- if inspect.isasyncgenfunction(wrapped_func):
120
-
121
- @functools.wraps(wrapped_func)
122
- async def async_gen_wrapper(*args, **kwargs):
123
- try:
124
- call_uuid = str(uuid.uuid4())
125
-
126
- inputs = format_args_for_trace(
127
- inspect.signature(original_func), *args, **kwargs
128
- )
129
-
130
- dispatch_trace_event(
131
- func_name,
132
- inputs,
133
- "call",
134
- call_uuid,
135
- run_type=run_type,
136
- tags=tags,
137
- metadata=metadata,
138
- )
139
- async_gen = wrapped_func(*args, **kwargs)
140
-
141
- results = []
142
-
143
- async for item in async_gen:
144
- results.append(item)
145
- yield item
146
-
147
- dispatch_trace_event(
148
- func_name, inputs, "completion", call_uuid, results
149
- )
150
- except Exception as e:
151
- dispatch_trace_event(
152
- func_name, inputs, "completion", call_uuid, exception=e
153
- )
154
- raise
155
-
156
- return async_gen_wrapper
157
-
158
- # Sync generator function
159
- elif inspect.isgeneratorfunction(wrapped_func):
160
-
161
- @functools.wraps(wrapped_func)
162
- def gen_wrapper(*args, **kwargs):
163
- try:
164
- call_uuid = str(uuid.uuid4())
165
-
166
- inputs = format_args_for_trace(
167
- inspect.signature(original_func), *args, **kwargs
168
- )
169
-
170
- results = []
171
-
172
- dispatch_trace_event(
173
- func_name,
174
- inputs,
175
- "call",
176
- call_uuid,
177
- run_type=run_type,
178
- tags=tags,
179
- metadata=metadata,
180
- )
181
- gen = wrapped_func(*args, **kwargs)
182
- for item in gen:
183
- results.append(item)
184
- yield item
185
- dispatch_trace_event(
186
- func_name, inputs, "completion", call_uuid, results
187
- )
188
- except Exception as e:
189
- dispatch_trace_event(
190
- func_name, inputs, "completion", call_uuid, exception=e
191
- )
192
- raise
193
-
194
- return gen_wrapper
321
+ return _create_traced_wrapper(
322
+ func=original_func,
323
+ wrapper_func=wrapped_func,
324
+ func_name=func_name,
325
+ run_type=run_type,
326
+ tags=tags,
327
+ metadata=metadata,
328
+ )
195
329
 
196
- # Async function
197
- elif inspect.iscoroutinefunction(wrapped_func):
198
330
 
199
- @functools.wraps(wrapped_func)
200
- async def async_wrapper(*args, **kwargs):
201
- try:
202
- call_uuid = str(uuid.uuid4())
331
+ def _uipath_traced(
332
+ run_type: Optional[str] = None,
333
+ span_type: Optional[str] = None,
334
+ input_processor: Optional[Callable[..., Any]] = None,
335
+ output_processor: Optional[Callable[..., Any]] = None,
336
+ ):
337
+ """Decorator factory that creates traced functions using dispatch_trace_event."""
338
+
339
+ def decorator(func):
340
+ return _create_traced_wrapper(
341
+ func=func,
342
+ run_type=run_type,
343
+ span_type=span_type,
344
+ input_processor=input_processor,
345
+ output_processor=output_processor,
346
+ )
203
347
 
204
- inputs = format_args_for_trace(
205
- inspect.signature(original_func), *args, **kwargs
206
- )
348
+ return decorator
207
349
 
208
- dispatch_trace_event(
209
- func_name,
210
- inputs,
211
- "call",
212
- call_uuid,
213
- run_type=run_type,
214
- tags=tags,
215
- metadata=metadata,
216
- )
217
- result = await wrapped_func(*args, **kwargs)
218
- dispatch_trace_event(func_name, inputs, "completion", call_uuid, result)
219
- return result
220
- except Exception as e:
221
- dispatch_trace_event(
222
- func_name, inputs, "completion", call_uuid, exception=e
223
- )
224
- raise
225
350
 
226
- return async_wrapper
351
+ # Create patched version of traceable
352
+ def patched_traceable(*decorator_args, **decorator_kwargs):
353
+ # Handle the case when @traceable is used directly as decorator without arguments
354
+ if (
355
+ len(decorator_args) == 1
356
+ and callable(decorator_args[0])
357
+ and not decorator_kwargs
358
+ ):
359
+ func = decorator_args[0]
360
+ return _create_appropriate_wrapper(func, original_traceable(func), {})
227
361
 
228
- # Regular sync function (default case)
229
- else:
362
+ # Handle the case when @traceable(args) is used with parameters
363
+ original_decorated = original_traceable(*decorator_args, **decorator_kwargs)
230
364
 
231
- @functools.wraps(wrapped_func)
232
- def sync_wrapper(*args, **kwargs):
233
- try:
234
- call_uuid = str(uuid.uuid4())
365
+ def uipath_trace_decorator(func):
366
+ # Apply the original decorator with its arguments
367
+ wrapped_func = original_decorated(func)
368
+ return _create_appropriate_wrapper(func, wrapped_func, decorator_kwargs)
235
369
 
236
- inputs = format_args_for_trace(
237
- inspect.signature(original_func), *args, **kwargs
238
- )
370
+ return uipath_trace_decorator
239
371
 
240
- dispatch_trace_event(
241
- func_name,
242
- inputs,
243
- "call",
244
- call_uuid,
245
- run_type=run_type,
246
- tags=tags,
247
- metadata=metadata,
248
- )
249
- result = wrapped_func(*args, **kwargs)
250
- dispatch_trace_event(func_name, inputs, "completion", call_uuid, result)
251
- return result
252
- except Exception as e:
253
- dispatch_trace_event(
254
- func_name, inputs, "completion", call_uuid, exception=e
255
- )
256
- raise
257
372
 
258
- return sync_wrapper
373
+ # Register the UIPath traced decorator
374
+ def register_uipath_tracing():
375
+ """Register the UIPath tracing decorator with TracedDecoratorRegistry."""
376
+ # Reapply to all previously decorated functions
377
+ TracingManager.reapply_traced_decorator(_uipath_traced)
259
378
 
260
379
 
261
380
  # Apply the patch
262
- def _instrument_traceable():
381
+ def _instrument_traceable_attributes():
263
382
  """Apply the patch to langsmith module at import time."""
264
383
  global original_langsmith, original_traceable
265
384
 
385
+ # Register our custom tracing decorator
386
+ register_uipath_tracing()
387
+
266
388
  # Import the original module if not already done
267
389
  if original_langsmith is None:
268
390
  # Temporarily remove our custom module from sys.modules
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath-langchain
3
- Version: 0.0.90
3
+ Version: 0.0.92
4
4
  Summary: UiPath Langchain
5
5
  Project-URL: Homepage, https://uipath.com
6
6
  Project-URL: Repository, https://github.com/UiPath/uipath-langchain-python
@@ -25,7 +25,7 @@ Requires-Dist: pydantic-settings>=2.6.0
25
25
  Requires-Dist: python-dotenv>=1.0.1
26
26
  Requires-Dist: requests>=2.23.3
27
27
  Requires-Dist: types-requests>=2.32.0.20241016
28
- Requires-Dist: uipath<2.1.0,>=2.0.9
28
+ Requires-Dist: uipath<2.1.0,>=2.0.14
29
29
  Provides-Extra: langchain
30
30
  Description-Content-Type: text/markdown
31
31
 
@@ -8,9 +8,9 @@ uipath_langchain/_cli/_runtime/_escalation.py,sha256=oA5NvZvCo8ngELFJRyhZNM69DxV
8
8
  uipath_langchain/_cli/_runtime/_exception.py,sha256=USKkLYkG-dzjX3fEiMMOHnVUpiXJs_xF0OQXCCOvbYM,546
9
9
  uipath_langchain/_cli/_runtime/_input.py,sha256=gKzPaGW-EzgeAskWJjbCWnfZRLu_BM7lCXkq0XkVGLU,5614
10
10
  uipath_langchain/_cli/_runtime/_output.py,sha256=WQSrsvGaaclZ6GLWEh6Nk1Mz1iGaIB45PgIX3DS3AN4,16130
11
- uipath_langchain/_cli/_runtime/_runtime.py,sha256=M82qhxU6OVrobiaqoktPYEN9HQyK4NjuW9VgrTAxfWs,11803
11
+ uipath_langchain/_cli/_runtime/_runtime.py,sha256=wj6e6tQdP2GjuSM-6G6Ug-FMqwOHwfUq-DGbd1gMfIg,11825
12
12
  uipath_langchain/_cli/_utils/_graph.py,sha256=WLBSJfPc3_C07SqJhePRe17JIc5wcBvEqLviMcNOdTA,6950
13
- uipath_langchain/_utils/__init__.py,sha256=Sp2qnEXLAp9ftQ09x7CZMenYnpXIIGFJNv8zNN7vAsw,172
13
+ uipath_langchain/_utils/__init__.py,sha256=WoY66enCygRXTh6v5B1UrRcFCnQYuPJ8oqDkwomXzLc,194
14
14
  uipath_langchain/_utils/_request_mixin.py,sha256=t_1HWBxqEl-wsSk9ubmIM-8vs9BlNy4ZVBxtDxktn6U,18489
15
15
  uipath_langchain/_utils/_settings.py,sha256=MhwEVj4gVRSar0RBf2w2hTjO-5Qm-HpCuufqN3gSWjA,3390
16
16
  uipath_langchain/_utils/_sleep_policy.py,sha256=e9pHdjmcCj4CVoFM1jMyZFelH11YatsgWfpyrfXzKBQ,1251
@@ -24,17 +24,17 @@ uipath_langchain/retrievers/__init__.py,sha256=rOn7PyyHgZ4pMnXWPkGqmuBmx8eGuo-Oy
24
24
  uipath_langchain/retrievers/context_grounding_retriever.py,sha256=CeVSMEz5xTQIladkzDLeQXGC1_ycW72gb0RB41JZeYA,2000
25
25
  uipath_langchain/tracers/AsyncUiPathTracer.py,sha256=8eGWZ56iJcmhtRQU4cHuZYt6aJXqc8RB2OL_BCMp-Ow,10463
26
26
  uipath_langchain/tracers/UiPathTracer.py,sha256=V5g1nlB0TI1wYvUIkfCEcAdhy4thqeMBmjflWtxc-_M,5601
27
- uipath_langchain/tracers/__init__.py,sha256=8DeXfBFhu6IaqDRj_ffjRV01I8q5i_8wXbnhBZTwXnc,219
27
+ uipath_langchain/tracers/__init__.py,sha256=MwrQh6iuPXMS72S5EX0JdCAX0TKe-l7fIPGV3EG0Ssk,256
28
28
  uipath_langchain/tracers/_events.py,sha256=CJri76SSdu7rGJIkXurJ2C5sQahfSK4E5UWwWYdEAtE,922
29
- uipath_langchain/tracers/_instrument_traceable.py,sha256=csPMKd-dk4jrnrxWyS177mLxUBKs-xZyj1tfRQgWrYE,9244
29
+ uipath_langchain/tracers/_instrument_traceable.py,sha256=MP1xmSRpuzsGePoioiHUU0R7gT-BW6eA-25qKZpLyOk,13182
30
30
  uipath_langchain/tracers/_utils.py,sha256=JOT1tKMdvqjMDtj2WbmbOWMeMlTXBWavxWpogX7KlRA,1543
31
31
  uipath_langchain/utils/__init__.py,sha256=-w-4TD9ZnJDCpj4VIPXhJciukrmDJJbmnOFnhAkAaEU,81
32
32
  uipath_langchain/utils/_request_mixin.py,sha256=WFyTDyAthSci1DRwUwS21I3hLntD7HdVzYc0ZPoi3ys,18296
33
33
  uipath_langchain/utils/_settings.py,sha256=MhwEVj4gVRSar0RBf2w2hTjO-5Qm-HpCuufqN3gSWjA,3390
34
34
  uipath_langchain/utils/_sleep_policy.py,sha256=e9pHdjmcCj4CVoFM1jMyZFelH11YatsgWfpyrfXzKBQ,1251
35
35
  uipath_langchain/vectorstores/context_grounding_vectorstore.py,sha256=eTa5sX43-ydB1pj9VNHUPbB-hC36fZK_CGrNe5U2Nrw,9393
36
- uipath_langchain-0.0.90.dist-info/METADATA,sha256=BVn0Hp0FpVC3BrXtGBfMNwixP9VapW8dxRyWCJvnutI,3818
37
- uipath_langchain-0.0.90.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
38
- uipath_langchain-0.0.90.dist-info/entry_points.txt,sha256=FUtzqGOEntlJKMJIXhQUfT7ZTbQmGhke1iCmDWZaQZI,81
39
- uipath_langchain-0.0.90.dist-info/licenses/LICENSE,sha256=JDpt-uotAkHFmxpwxi6gwx6HQ25e-lG4U_Gzcvgp7JY,1063
40
- uipath_langchain-0.0.90.dist-info/RECORD,,
36
+ uipath_langchain-0.0.92.dist-info/METADATA,sha256=gQX7bMt93pOFiHdTXAMZ1J3pBr6-sJuBP1BnybEtNAE,3819
37
+ uipath_langchain-0.0.92.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
38
+ uipath_langchain-0.0.92.dist-info/entry_points.txt,sha256=FUtzqGOEntlJKMJIXhQUfT7ZTbQmGhke1iCmDWZaQZI,81
39
+ uipath_langchain-0.0.92.dist-info/licenses/LICENSE,sha256=JDpt-uotAkHFmxpwxi6gwx6HQ25e-lG4U_Gzcvgp7JY,1063
40
+ uipath_langchain-0.0.92.dist-info/RECORD,,